解決AJAX中POST或GET傳遞中文字元亂碼

來源:互聯網
上載者:User

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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.