AJAX傳值中文亂碼

來源:互聯網
上載者:User

  AJAX傳值時採用的是UTF-8編碼格式,用戶端中文字元傳輸到伺服器端時,如果伺服器編碼格式或者所採用的MVC架構的編碼格式不是UTF-8,則很可能會出現中文亂碼。解決辦法如下:

用戶端用js函數encodeURI()對中文字元進行兩次編碼,伺服器端採用URLDecoder類對用戶端傳輸過來的中文字元進行UTF-8格式的解碼。樣本:

$.ajax({type: "post",url: "createNewGroup.action",data:"name="+encodeURI(encodeURI("張三")),success: function(msg){alert(msg);}});
伺服器端代碼:
String name = URLDecoder.decode("用戶端傳輸過來的中文字元","UTF-8");

伺服器端往用戶端傳輸中文字元出現亂碼時,伺服器端可採用URLEncoder類對中文字元進行UTF-8格式的編碼。用戶端採用js函數decodeURI()對伺服器端傳輸過的中文字元進行兩次解碼。

當伺服器端傳輸的是一個json串時,且不可對整個json串進行UTF-8格式的編碼(編碼後的json串有可能不再具有json原有格式),可採用JsonValueProcessor介面和JsonConfig類對json串中的value進行單獨編碼。

範例程式碼:

JsonConfig jsonConfig = new JsonConfig();jsonConfig.registerJsonValueProcessor(String.class,new JsonValueProcessor(){public Object processArrayValue(Object value, JsonConfig jsonConfig) {return process(value);}public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) {return process(value);}/*** process* @param value* @return*/public Object process(Object value) {try {if (value instanceof String) {return URLEncoder.encode(value.toString(),"UTF-8");}return value == null ?"" : value.toString();} catch (Exception e) {return "";}}});JSONArray json = JSONArray.fromObject("[{name:\"張三\";age:\12\";sex:\"男\"}]",jsonConfig); //編碼後的json串[java] view plaincopyprint?JsonConfig jsonConfig = new JsonConfig();       jsonConfig.registerJsonValueProcessor(String.class,        new JsonValueProcessor(){          public Object processArrayValue(Object value, JsonConfig jsonConfig) {               return process(value);           }            public Object processObjectValue(String key, Object value,                   JsonConfig jsonConfig) {              return process(value);          }                     /**           * process           * @param value           * @return           */           public Object process(Object value) {               try {                   if (value instanceof String) {                                         return  URLEncoder.encode(value.toString(), "UTF-8");                   }                   return value == null ? "" : value.toString();               } catch (Exception e) {                   return "";               }             }         });             JSONArray json = JSONArray.fromObject("[{name:\"張三\";age:\12\";sex:\"男\"}]",                             jsonConfig       ); //編碼後的json串  

用戶端使用函數decodeURI()再對json串中的value值進行兩次解碼即可。


在瀏覽器端使用XMLHttpRequest對象向伺服器端傳送中文參數,如果不在瀏覽器端和伺服器端進行處理時,會出現中文亂碼問題.針對這種問題,有很多的解決辦法,但往往都是在IE下可以正常顯示中文,在其他瀏覽器下(比如FireFox)卻仍然是亂碼.在FireFox下解決了亂碼問題,但回到IE下訪問卻出現了亂碼問題.所以針對要在目前流行的各種瀏覽器下解決中文亂碼問題,才能使編寫的Web程式變得通用.
針對這種問題的解決方案,我總結大致有兩種:

一,在瀏覽器端對要傳遞的中文參數進行編碼處理.代碼如下:

xmlhttp.open("POST","AjaxServlet",true); //請求參數初始化

xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因為請求方式為POST,所以這裡要佈建要求頭.(如果請求方式為GET,此句代碼可以省略)
xmlhttp.send("name="+encodeURI(encodeURI("中國"))); //向伺服器端發送參數


在伺服器端代碼:
PrintWriter out = response.getWriter(); //得到response的輸出資料流對象

String name1 = request.getParameter("name"); //得到KEY為"name"的請求參數 
String name = URLDecoder.decode(name1,"utf-8"); //對得到的參數進行解碼

out.print(name); //向瀏覽器端發送資料


二,在瀏覽器端對要傳遞的中文參數進行編碼處理.代碼如下:

xmlhttp.open("POST","AjaxServlet",true); //請求參數初始化

xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因為請求方式為POST,所以這裡要佈建要求頭.(如果請求方式為GET,此句代碼可以省略)

xmlhttp.send("name="+encodeURI("中國")); //向伺服器端發送參數

在伺服器端代碼:

PrintWriter out = response.getWriter(); //得到response的輸出資料流對象

String name1 = request.getParameter("name"); //得到KEY為"name"的請求參數 
String name = new String((name1.getBytes("ISO-8859-1")),"UTF-8"); //對得到的參數進行解碼
out.print(name); //向瀏覽器端發送資料
以上兩種方法,在使用XMLHttpRequest對象傳遞中文參數時,亂碼問題可以在任意瀏覽器下解決,正確顯示中文.

原文出處已經不記得了,希望作者能夠見諒,

相關文章

聯繫我們

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