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