使用ajax請求json數據的時候,不管如何返回的響應編碼都是ISO-8859-1類型,由於統一都是utf-8編碼,致使出現返回結果中文亂碼狀況。html
1 $.ajax({ 2 type:"post", 3 url:"http://...", 4 data:JSON.stringify(data), 5 dataType:"json", 6 contentType:"application/json;charset=utf-8", 7 success:function(data){ 8 // 9 }, 10 error:function(data){ 11 // 12 } 13 })
返回結果類型: ajax
使用了SpringMVC框架的@RequestBody 和 @ResponseBody兩個註解,分別完成請求對象到對象響應的過程,一步到位,可是由於Spring3.x之後有了HttpMessageConverter消息轉換器,把返回String類型的數據編碼所有默認轉換成iso-8859-1的編碼格式,因此就出現了咱們遇到的亂碼的狀況,如返回list或其它則使用 MappingJacksonHttpMessageConverter。spring
根據遇到的問題總結了三種可行的方案:json
1.手動設置響應的的Content-type屬性:瀏覽器
1 @RequestMapping(value = "/next_page.action",method = RequestMethod.POST,produces = {"text/html;charset=utf-8"})
直接設置返回的屬性,這樣有個很差的地方是,每一個方法都要寫一次produces,比較麻煩。session
2.不使用@ResponseBody註解,直接經過response的方法返回數據mvc
1 @RequestMapping(value = "/next_page.action",method = RequestMethod.POST) 2 public void getUsersByPage(@RequestBody JSONObject params,HttpSession session,HttpServletResponse response) throws IOException { 3 4 int page = Integer.parseInt(params.get("page").toString())-1; 5 List<User> ulist = null; 6 //。。。。 7 response.setContentType("text/html;charset=UTF-8");//這些設置必需要放在getWriter的方法以前, 8 response.getWriter().print(JSON.toJSONString(ulist)); 9 }
注意:response.setContentType必定要放在getWriter方法以前,不然編碼設置將無效,由於它決定了該返回結果該以什麼編碼輸出到客戶端瀏覽器。不能顛倒。app
3.使用註解方式修改默認響應編碼設置:框架
1 <!-- 註解驅動 --> 2 <mvc:annotation-driven> 3 <!-- 指定http返回編碼格式,否則返回ajax請求json會出現中文亂碼 --> 4 <mvc:message-converters> 5 <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 6 <property name="supportedMediaTypes"> 7 <list> 8 <value>text/html;charset=UTF-8</value> 9 <value>application/json;charset=UTF-8</value> 10 <value>*/*;charset=UTF-8</value> 11 </list> 12 </property> 13 </bean> 14 </mvc:message-converters> 15 </mvc:annotation-driven>
在spring-servlet.xml配置文件中加入此配置,將修改轉換器的默認編碼方式爲utf-8;此種方式會比較好用,由於一次配置就不會再有相同編碼問題了,一次配置完美解決。post
以上三個方法均可以完美解決此種亂碼問題,可是仍是第三種配置方式最佳。
====