1. 程式人生 > >解決:JS向後臺傳參,IE下中文未編碼問題

解決:JS向後臺傳參,IE下中文未編碼問題

1.問題描述

   專案中用jQuery向後臺URL傳參獲取資料時,google瀏覽器正常執行,但IE沒有資料返回。js程式碼如下:

jsonurl = urlPreffix +"getInfoByCity.do?city="+$j("#city").val();
$j.getJSON(jsonurl,function(data) {
.....
})

2.分析

   用瀏覽器除錯後顯示:

   Google下URL為:....getInfoByCity.do?city=%e5%8c%97%e4%ba%ac(其中http頭資訊中涉及編碼的地方均為utf-8)

   IE下URL為:....getInfoByCity.do?city=北京(其中http頭資訊中涉及編碼的地方均為utf-8)

   為防止URL特殊字元截斷影響解析,傳參時要做URL編碼,編碼成%xx的形式。開始猜測是因為IE沒有對中文做編碼,但是URL中的特殊字元(非ASCII碼)是必須經過編碼才能訪問的。

   到此基本可以認為問題是引數中中文編碼出錯導致。編碼原理是先獲取字元在某種字符集(utf-8、gb2312等)下對應的十六進位制編碼,再兩兩一組前加上%形成。如北京在UTF-8下的十六進位制編碼為e58c97e4baac,因此它的URL編碼為%e5%8c%97%e4%ba%ac(這也正是谷歌瀏覽器的結果)。gb2312下卻是%b1%b1%be%a9。

   那麼問題就清楚了,因為Google中為utf-8編碼且能正常查詢出資料,推斷伺服器用utf-8解碼。那麼,肯定是因為IE下按照非utf-8(一般是GB2312)對漢字做了編碼,但是伺服器解碼的時候是按照utf-8解碼的,自然就會亂碼,也就查不出資料了。

3.解決

   既然瀏覽器對URL編碼存在那麼多的差異及不確定性,那麼最好的解決辦法就是在把URL傳給瀏覽器之前就將編碼工作做完,這些問題就不存在了。下面兩個方案都是先編碼再傳給瀏覽器的方法。

   方案一:對URI編碼再拼接到URL上(後臺獲取到引數後不必自己做解碼,系統會自動解碼)

jsonurl = urlPreffix +encodeURI("getInfoByCity.do?city="+$j("#city").val());
$j.getJSON(jsonurl,function(data) {
......
})

   除了encodeURI函式外,jQuery還提供了一個編碼函式encodeURIComponent,但是這個函式對字元&?也會做編碼,所以這個函式不能傳入參與URL解析的字元,最好只傳入引數值,如:

jsonurl = urlPreffix +"getInfoByCity.do?city="+encodeURIComponent($j("#city").val());

  方案二:直接用getJSON函式的第二個引數傳入JSON形式的引數對,函式內自動編碼:

var params = {"city":$j("#city").val()};
jsonurl = urlPreffix +"getSellerInfoByCity.do";
$j.get(jsonurl,params,function(data) {
......
})

4.總結

  雖然問題已經解決,但對原理還是一知半解,需要進一步學習。