ajax中文亂碼多種解決辦法

來源:互聯網
上載者:User

因為XMLHttp在處理返回的responstText的時候把responstBody按UTF-8編碼進行解碼的,如果伺服器端送出的資料流的確是UTF-8編碼,那麼中文字就會正確顯示,但如果是GBK或是其他編碼則會出現上述情況。


AJAX的中文亂碼可以大概分為兩中,第一種是向伺服器端發送中文參數時(xmlhttp.open(“get|post”,url,true)),伺服器端接收到的為亂碼,這個也是我今天遇到的問題,沒做處理之前,在IE裡是正常的,但是在Firefox裡面就出現了亂碼,我先把接收到參數輸出到一個文本裡,沒有發現什麼問題,鬱悶了,然後我就把查詢語句在輸出來觀察(我這裡是要從資料庫裡查出與參數相關的東西),終於發現問題,IE和Firefox輸出的參數不一樣,雖然漢字上都一樣,但是和前後串連上有細小的區別,於是認定了是編碼問題,在網上尋找了相關資料,都沒能解決問題,但是得到一些啟示,因為AJAX發送資料都是採用UTF-8編碼的方式發送的,所以要在伺服器端進行編碼轉換(我這裡頁面是採用GB2312編碼的,如果是採用UTF-8的話應該不會有這步的問題),所以我在伺服器端進行了UTF-8轉GB2312,
 
$str=iconv(“UTF-8″,”GB2312″,$str);
 
然後測試,在Firefox上順利解決了問題,以為大公告成了,可是再到IE下測試,發現IE又出現了問題,伺服器端接收到的參數沒值,這下就鬱悶了,突然看到發送頭設定了setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);,就找到問題所在了,然後就在發送那裡進行了參數編碼:

 代碼如下 複製代碼
geturl=encodeURI(geturl);
geturl=encodeURI(geturl); //兩次也可以寫成geturl=encodeURI(encodeURI(geturl));
xmlhttp.open(“GET”,geturl,true);
然後再到伺服器端進行URL解碼:
$str=urldecode($str); //解碼
$ str =iconv(“UTF-8″,”GB2312″,$ str);  //編碼轉換

注意:解碼必須在編碼轉換前面,不然得不到正確值
儲存測試,IE和Firefox都能正常了。
第二種就是伺服器端向用戶端輸出中文時出現亂碼,這類問題網上的答案就比較多了,也都能解決,為了避免各位再去尋找,我在這裡就COPY下J
原因:AJAX在接收responseText或responseXML的值的時候是按照UTF-8的格式來解碼的,如果伺服器段發送的資料不是UTF-8的格式,那麼接收responseText或responseXML的值有可能為亂碼。

ajax亂碼解決辦法一

在伺服器指定發送資料的格式:
在jsp檔案中:

 代碼如下 複製代碼
response.setContentType(“text/text;charset=UTF-8″);//返回的是txt文字檔
或是
response.setContentType(“text/xml;charset=UTF-8″);//返回的xml檔案
PHP:header(”Content-Type:text/html;charset=GB2312”);

ajax亂碼解決方案二
PHP發送中文、Ajax接收
只需在php頂部加入一句:

 代碼如下 複製代碼
header(‘Content-type: text/html;charset=GB2312′);

xmlHttp會正確解析其中的中文。
Ajax發送中文、PHP接收
這個比較複雜:
Ajax中先用encodeURIComponent對要提交的中文進行編碼
PHP中:

 代碼如下 複製代碼
$GB2312string=iconv( ‘UTF-8′, ‘gb2312//IGNORE’ , $RequestAjaxString);
PHP寫入MySQL資料庫
建立conn時,query一下set names “gb2312″

==================================================
注意紅色部分!!!否則無法使用!!!具體原因自己猜!

 代碼如下 複製代碼
iconv( “UTF-8″,”GBK” , $gametypes["name"]);


 原創:
我的亂碼問題是AJAX取資料時產生亂碼,本來頁面是採用GBK編碼的。後來顯示為亂碼,我使用UE把它轉換成UTF-8後,
頁面上原來的元素就可以顯示正確了。但是,資料庫取出來的值還是會亂碼。
ob_get_contents ();
取出所有的顯示資料,然後輸出到記錄檔,顯示全是亂碼。
使用UE把檔案再轉換成GBK,然後再輸出,顯示就正確了。
這裡再使用:

 代碼如下 複製代碼
header(‘Content-Type:text/html;charset=GBK’);

前台頁面顯示就正常。

說了這麼多我們來看執行個體

例如:

 代碼如下 複製代碼

var url="a.jsp?name=小李";
xmlHTTP.open ("post",url,true);

解決辦法:

利用javascript的提供的escape()或encodeURI()方法

例如:

用戶端:

 代碼如下 複製代碼

var url="a.jsp?name=小李";
url=encodeURI(url);
url=encodeURI(url); //兩次,很關鍵[具體為什麼,我也不清楚]
/********************************************/
也有人寫成var url="a.jsp?name=escape("小李")";

功能和encodeURI方法類似。

/********************************************/
xmlHTTP.setrequestheader("cache-control","no-cache");
xmlHTTP.setrequestheader("Content-Type","application/x-www-form-urlencoded");
xmlHTTP.setrequestheader("contentType","text/html;charset=uft-8")//指定發送資料的編碼格式
xmlHTTP.open ("post",url,true);

伺服器端:

 代碼如下 複製代碼
String name = request.getParameter("name");
name = java.net.URLDecoder.decode("name", "UTF-8");

總結了一下最簡單的方法就是頁面和請求返回的頁面編碼一致就好了


解決AJAX中文回傳亂碼,其實就是將在伺服器端檔案加一個HEADER,指明送出的是什麼編碼流。比如

ASP文檔就是在頭部增加一行說明:

 代碼如下 複製代碼
Response.Charset("GB2312")

PHP的樣本如下:

 代碼如下 複製代碼
header('Content-Type:text/html;charset=GB2312');

JSP的如下:

 代碼如下 複製代碼
response.setHeader("Charset","GB2312");
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.