2010-10-22 107 views
50

我的Java Web应用程序提交返回JSON这样的AJAX请求:JSON字符编码

{'value': 'aériennes'} 

当“aériennes”被显示在网页时,显示为“ariennes”,所以我想有一些种字符编码问题。 AJAX响应标头包括

Content-Type application/json 

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

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

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

回答

14

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

{"value": "aériennes"} 

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

JSON数据的内容类型should beapplication/json。实际的JSON数据(我们上面的)应该使用UTF-8,UTF-16或UTF-32编码 - 我推荐使用UTF-8。

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

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

52

症状表明最初使用UTF-8编码的JSON字符串使用ISO-8859-1编码写入HTTP响应,并指示webbrowser将其显示为UTF-8。如果它是使用UTF-8编写的并显示为ISO-8859-1,那么您将会看到aériennes。如果使用ISO-8859-1显示,那么您将会看到a�riennes

要解决JSON字符串被错误地写为ISO-8859-1的问题,您需要配置您的webapp/Spring使用UTF-8作为HTTP响应编码。 基本上,它应该做的事情在幕后执行以下操作:

response.setCharacterEncoding("UTF-8"); 

不要改变你的内容类型头。这对JSON来说非常好,它已经被显示为UTF-8。

4

这发生在我身上正好与此相同:

<%@ 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。

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

我不知道这是否相关,但我使用@RequestMapping注解对其进行了修复。

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

谢谢Lars Juel Jensen!你的答案解决了我的这篇文章的问题http://stackoverflow.com/questions/29865056/jquery-datatables-does-not-show-unicode-characters – 2015-04-25 12:57:02

0

如果您使用StringEntity尝试this,使用的字符编码的选择。它也处理外来字符。

6

我终于得到了解决:

只有把这个线

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

这有一定帮助。

0

此外,您还可以使用Spring注解RequestMapping上述控制器类receveing 应用/ JSON; UTF-8在所有响应

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

如果上述建议的解决方案并没有解决您的问题(对我来说),这可能也有帮助:

我的问题是我在使用Springs @ResponseBody在我的响应中返回一个json字符串。如果你也这样做,这可能会有所帮助。

将以下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> 

(这里找到:http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8

1

这些问题的答案在这里帮我解决我的问题,虽然它不是完全相关。 我使用javax.ws.rs API和@Produces和@Consumes注释,并有这个相同的问题 - 我在web服务中返回的JSON不是UTF-8。我用下面的注解解决它在我的控制器功能顶:

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

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

在每个端点的GET和POST功能。我没有设置字符集,这解决了它。这是球衣的一部分,所以也许你必须添加一个Maven依赖。