JSON字符编码

我的Java Web应用程序提交返回JSON的AJAX请求,例如:

{'value': 'aériennes'} 

当“aériennes”显示在网页上时,它显示为“ariennes”,所以我猜这是一些字符编码问题。 AJAX响应头包括

 Content-Type application/json 

这似乎没有包含任何字符集信息。 我想这需要改变成类似的东西

 Content-Type text/html; charset=iso-8859-1 (or charset=utf8) 

应用程序的服务器端是Spring MVC,我想必须有一种方法来设置每个响应的默认字符集?

症状表明,最初使用UTF-8编码的JSONstring使用ISO-8859-1编码写入HTTP响应,并且指示浏览器将其显示为UTF-8。 如果它是使用UTF-8编写的,并显示为ISO-8859-1,那么您将看到aériennes 。 如果它是用ISO-8859-1编写显示的,那么你就可以看到a�riennes

为了解决JSONstring错误地写成ISO-8859-1的问题,你需要configuration你的webapp / Spring使用UTF-8作为HTTP响应编码。 基本上 ,应该在下面做下面的事情:

 response.setCharacterEncoding("UTF-8"); 

不要更改您的内容types标题。 这对于JSON来说是非常好的,它被显示为UTF-8。

我不知道这是否是相关的,但我用@RequestMapping注解修复它。

 @RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"}) 

首先,您发布的数据不是有效的JSON。 这将是:

 {"value": "aériennes"} 

注意双引号:它们是必需的。

JSON数据的内容types应该是 application/json 。 实际的JSON数据(我们上面的)应该使用UTF-8,UTF-16或UTF-32进行编码 – 我推荐使用UTF-8。

您可以使用像Wireshark这样的工具来监视networkingstream量并查看数据的外观,您应该可以看到é的字节数。 我从来没有使用过Spring,但是如果它正在执行JSON编码,那么这对您来说可能是正确的。

一旦JSON到达浏览器,它应该是好的,如果它是有效的。 但是,您如何将JSON响应中的数据插入到网页中?

最后我得到了解决办法:

只放这条线

 @RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8") 

这一定会有所帮助。

这发生在我身上完全一样的:

 <%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%> 

但是这对我有用:

 <%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%> 

尝试添加

  ;charset=UTF-8 

到您的contentType。

 response.setContentType("application/json;charset=utf-8"); 

这里的答案帮助我解决了我的问题,尽pipe它并不完全相关。 我使用javax.ws.rs API和@Produces和@Consumes注解,并有同样的问题 – 我在Web服务中返回的JSON不是UTF-8。 我用我的控制器function上面的注释解决它:

 @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

 @Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

在每个端点的get和post函数上。 我没有设置字符集,这解决了它。 这是jersey的一部分,所以也许你将不得不添加一个maven的依赖。

如果您使用的是StringEntity尝试使用您select的字符编码。 它也处理外来字符。

此外,你可以使用spring注释RequestMapping上面的控制器类来接收应用程序/ json;在所有的响应utf-8

 @Controller @RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"}) public class MyController{ ... } 

如果上述build议的解决scheme没有解决您的问题(就我而言),这也可以帮助:

我的问题是,我正在返回一个JSONstring在我的响应使用弹簧@ResponseBody 。 如果你这样做,这可能会有所帮助。

将以下bean添加到您的调度程序servlet。

 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean> 

(在这里find: http : //forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8 )