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 )