ajax中文亂碼有很多原因那麼如何解決這個亂碼問題呢?
很簡單,使用 JS的內建函數 encodeURIComponent 對中文字串進行轉義一下就好了。關於 encodeURIComponent 函數的用法,
scape() 方法:
採用ISO Latin字元集對指定的字串進行編碼。所有的空格符、標點符號、特殊字元以及其他非ASCII字元都將被轉化成%xx格式的字元編碼(xx等於該字元在字元集表裡面的編碼的16進位數字)。比如,空格符對應的編碼是%20。
不會被此方法編碼的字元: @ * / +
encodeURI() 方法:
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。
不會被此方法編碼的字元:! @ # $& * ( ) = : / ; ? + '
encodeURIComponent() 方法:
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。與encodeURI()相比,這個方法將對更多的字元進行編碼,比如 / 等字元。所以如果字串裡麵包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字元被編碼之後URL將顯示錯誤。
不會被此方法編碼的字元:! * ( ) '
因此,對於中文字串來說,如果不希望把字串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用 escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要採用encodeURI或者 encodeURIComponent。
例子
1.發送路徑中的參數有中文,在伺服器段接收參數值是亂碼
解決辦法:前端(用戶端)兩次編碼,後端(伺服器)一次解碼!
前端:
代碼如下 |
複製代碼 |
var url="index.jsp?test=來自前台我不是亂碼"; url=encodeURI(url); url=encodeURI(url); //兩次編碼 XMLHTTP.open ("post",url,true); 後端: String name = arg0.getParameter("test"); name = java.net.URLDecoder.decode(name, "UTF-8");//一次解碼 System.out.println("前台傳過來的參數:" + name);//輸出結果:來自前台我不是亂碼
|
2.返回來的responseText或responseXML的值中含有中文是亂碼
解決辦法:在後端指定發送資料的格式!
後端:
代碼如下 |
複製代碼 |
response.setContentType("text/xml;charset=UTF-8"); //這行放在流輸出前才好使 PrintWriter out = arg1.getWriter(); String info = "來自後台我不是亂碼"; out.println(info); 前端: var backInfo = XMLHttpReq.responseText;//後台返回的資訊 alert(backInfo);//結果:來自後台我不是亂碼
|
3.總結
1) Ajax提交資料的格式預設為utf-8,利用javascript的提供的encodeURI()方法兩次編碼.在伺服器端接收的時候要使用java.net.URLDecoder.decode("","UTF-8")方法解碼一次.
2) AJAX在接收responseText或responseXML的值的時候是按照UTF-8的格式來解碼的,所以伺服器要向用戶端發送資料的時候,也要採用utf-8編碼, response.setContentType("text/xml;charset=UTF-8").
3)如果上述方法仍然解決不了亂碼問題,那你嘗試一下把jsp,htm,java檔案用UTF-8編碼格式儲存.總之,前後台資料互動都採用utf-8編碼就行了.
當網站已採用了諸如GBK/GB2312編碼時,分兩種情況:
1、Ajax發送中文字元、PHP(背景程式)進行接收發生亂碼時,使用GBK與UTF8的轉換函式對接受的字串進行編碼轉換,再存入相關資料庫,這裡假設資料庫採用的編碼是GBK或者GB2312,如果配置的PHP運行環境支援ICONV函數,你也可使用ICONV函數進行編碼轉換,然後在存入資料庫時
代碼如下 |
複製代碼 |
mysql_query("set names gb2312");
|
即可解決Ajax傳值中文亂碼問題。
2、PHP發送中文字元、Ajax(前台頁面)進行接收發生亂碼時,同樣可以使用ICONV函數對從資料庫中取出的字串進行編碼轉換,再傳值至Ajax前台,即responseText。或者在PHP(背景程式)輸出字元流之前加上
代碼如下 |
複製代碼 |
header('Content-type: text/html;charset=gb2312');
|
即可。特別指出:在使用Ajax做多級聯動(比如省份城市聯動)時,採用XML互動形式,在輸出XML之前也必須加上header。