AJAX中文亂碼總結
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("
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)如果上述方法仍然解決不了亂碼問題,
4.對轉碼用的一些方法的解釋
1)Js方法encodeURI
程式碼如下:
var uri="my test.asp?name=stale&car=saab";
document.write(encodeURI(uri));
上面的輸出如下:
my%20test.asp?name=st%C3%A5le&car=saab
2) Js方法encodeURIComponent
程式碼如下:
var uri="http://jb51.net/my test.asp?name=stale&car=saab";
document.write(encodeURIComponent(uri));
上面的輸出如下:
http%3A%2F%2Fjb51.net%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab
3)java方法
java.net.URLDecoder
public static String decode(String s,String enc) throws UnsupportedEncodingException
使用指定的編碼機制對 application/x-www-form-urlencoded 字串解碼。給定的編碼用於確定任何 "%xy" 格式的連續序列表示的字元。
注:World Wide Web Consortium Recommendation 宣告應使用 UTF-8。如果不使用該編碼,可能造成不相容性。
4)java方法
java.net.URLEncoder
public static String encode(String s, String enc) throws UnsupportedEncodingException
使用指定的編碼機制將字串轉換為 application/x-www-form-urlencoded 格式。該方法使用提供的編碼機制獲取不安全字元的位元組。
注:World Wide Web Consortium Recommendation 宣告應使用 UTF-8。如果不使用該編碼,可能造成不相容性。
5)
1.request.setCharacterEncoding("GBK")是設定從request中取得的值或從資料庫中取出的值response.setContentType("text/html;charset=GBK")是設定頁面中為中文編碼前者是設定動態文字(引數,資料庫),後者設定頁面靜態文字.
2.response.setContentType指定 HTTP 響應的編碼,同時指定了瀏覽器顯示的編碼,呼叫此方法,必須在getWriter執行之前或者response被提交之前.
3.response.setCharacterEncoding("GBK")設定HTTP 響應的編碼,如果之前使用response.setContentType設定了編碼格式,則使用response.setCharacterEncoding指定的編碼格式覆蓋之前的設定; response.setCharacterEncoding與response.setContentType相同的是,呼叫此方法,必須在getWriter執行之前或者response被提交之前.
轉載自:http://xbcxs.iteye.com/blog/800557