使用ajax傳送數據時,當數據中存在加號(+)、連接符(&)或者百分號(%)時,服務器端接收數據時會丟失數據。分析ajax傳送數據的格式與javascript的語法:
1. "+"號:javascript解析為字符串連接符,所以服務器端接收數據時"+"會丟失變空格。
2. "&"號:javascript解析為變量連接符,所以服務器端接收數據時&符號以后的數據都會丟失變空格。
解決方法是通過正則表達式進行編碼替換(假設poststr是你想通過ajax傳送的數據字符串)
poststr = poststr.replace(/%/g, "%25"); poststr = poststr.replace(/\&/g, "%26"); poststr = poststr.replace(/\+/g, "%2b");
下面是其它網友的補充
今天用ckeditor4編輯器時,把編輯器里面的內容通過ajax傳到后端的時候,居然發現后端接收的數據不完整,以下我編輯器內容的源碼:
<p> <img src="https://dss0.bdstatic.com/70cfuhsh_q1ynxgkpowk1hf6hhy/it/u=1483731740,4186543320&fm=26&gp=0.jpg"/> </p>
結果“4186543320”后面的內容就一直沒有收到。
原因:
通過網絡查資料,得到的原因是分號”;”導致的問題。
ajax傳輸以“;”分割的字符串,卻發現后臺只會接受到第一個字符串。
例如:我向后臺傳輸
“小明;小紅;小白”
后臺只會接收到小明。
經過我的親自測試,發現:
1、ajax傳的字符串數據,javascript用console.log可以完整的輸出來,只是后端接收不全,例如:
2、ajax傳的字符串數據,我直接傳分號”;”+其它正常數據,后臺一樣是可以接收到的,一點問題都沒有。
根本原因是:
ajax請求內容中包含一些html轉義字符,例如:
> < & "
最主要的是這些轉義字符中含有&。
例如:
如果我發送“ blablabla&ltgrogrogro”,則服務器僅收到“ blablabla”。
&在url參數中是什么意思?
我相信做過web程序開發的人都知道:&代表數據查詢字符串中的另一個變量,&以此格式表示新參數的開始。
最后去看了一下“ckeditor4編輯器”,無論是為空字符串還是回車,都會自動的幫你進行html轉義,哪怕你配置了“不轉義html”參數,也會自動幫你轉。
解決方法
知道了上面的原因,解決方法就容易大了,有程序經驗的人已經知道怎么做了?
原理就是:把html轉義字符解碼成標簽或者編碼再傳送數據。
以我這里用“ckeditor4編輯器”為例子,只需要修改config.js,增加如下配置參數:
config.basicentities = false; config.htmlencodeoutput = false;
以上這種也有一個弊端,如果你的編輯器里面有“代碼塊“功能,要插入一些代碼,例如:php、java、python、c++.......等等。代碼塊這里同樣也會自動進行html字符轉義。
最終的解決方法:
1、ajax請求傳字符串數據的時候,我們先做javascript url編碼,例如:
var contents = encodeuricomponent(document.getelementbyid( 'editor1' ).value);
編碼函數:encodeuricomponent()
解碼函數:decodeuricomponent()
注意:用此編碼函數,asp與php處理后端的時候不需要解碼,會自動的相互通訊,自動解碼。
或
編碼:encodeuri()
解碼:decodeuri()
注意:用此編碼函數,后端處理必須先解碼。
2、后端接收數據的時候,我們要做一個url解碼,以php為例子,例如:
$contents = htmlentities(urldecode($_post['contents']),ent_quotes);
urldecode() — 解碼
urlencode() — 編碼
注意:為了安全起見,不管前端用哪個函數?只要是url編碼過的,后端都需要解碼,好兼容。
其它解決方法:
ajax請求傳數據類型,可以改為:json、text。具體請參考:http content-type 類型
總結:
這個問題其實解決方法真的是太多了,我只是講了最簡單也是最常見的幾種吧!
到此這篇關于ajax post數據中有特殊符號(轉義字符)導致數據丟失的解決方法的文章就介紹到這了,更多相關ajax post數據丟失內容請搜索碩編程以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持碩編程!