JSON 字符编码
Posted
技术标签:
【中文标题】JSON 字符编码【英文标题】:JSON character encoding 【发布时间】:2011-04-29 01:49:19 【问题描述】:我的 Java Web 应用程序提交了一个返回 JSON 的 AJAX 请求:
'value': 'aériennes'
当“aériennes”显示在网页中时,它显示为“a�riennes”,所以我猜是某种字符编码问题。 AJAX 响应标头包括
Content-Type application/json
似乎不包含任何字符集信息。我想这需要更改为类似
Content-Type text/html; charset=iso-8859-1 (or charset=utf8)
应用的服务端是Spring MVC,我猜肯定有办法为每个响应设置默认字符集?
【问题讨论】:
【参考方案1】:这些症状表明最初采用 UTF-8 编码的 JSON 字符串是使用 ISO-8859-1 编码写入 HTTP 响应的,并指示网络浏览器将其显示为 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。
【讨论】:
【参考方案2】:我不知道这是否相关,但我用 @RequestMapping 注释修复了它。
@RequestMapping(method=RequestMethod.GET, produces="application/json; charset=UTF-8")
【讨论】:
谢谢拉尔斯·朱尔·詹森!你的回答解决了我这篇帖子的问题***.com/questions/29865056/…【参考方案3】:首先,您发布的数据不是有效的 JSON。这将是:
"value": "aériennes"
注意双引号:它们是必需的。
JSON 数据的 Content-Type should be application/json
。实际的 JSON 数据(我们上面的数据)应该使用 UTF-8、UTF-16 或 UTF-32 进行编码 - 我建议使用 UTF-8。
您可以使用 Wireshark 之类的工具来监控网络流量并查看数据的外观,您应该看到 é 的字节 c3 89
。我从未使用过 Spring,但如果它正在执行 JSON 编码,这可能会为您妥善处理。
一旦 JSON 到达浏览器,它应该是好的,如果它是有效的。但是,您如何将 JSON 响应中的数据插入网页?
【讨论】:
【参考方案4】:终于找到了解决办法:
只放这一行
@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")
这肯定会有帮助。
【讨论】:
【参考方案5】:发生在我身上的情况与此完全相同:
<%@ 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。
【讨论】:
【参考方案6】:response.setContentType("application/json;charset=utf-8");
【讨论】:
【参考方案7】:这里的答案帮助我解决了我的问题,尽管它并不完全相关。 我使用 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")
在每个端点的获取和发布功能上。我没有设置字符集,这解决了它。这是球衣的一部分,所以也许你必须添加一个 maven 依赖项。
【讨论】:
【参考方案8】:如果您使用的是StringEntity
,请尝试this,使用您选择的字符编码。它也处理外来字符。
【讨论】:
【参考方案9】:此外,您可以在控制器类上方使用 spring 注释 RequestMapping 来接收所有响应中的 application/json;utf-8
@Controller
@RequestMapping(produces = "application/json; charset=UTF-8","*/*;charset=UTF-8")
public class MyController
...
【讨论】:
【参考方案10】:如果上述建议的解决方案不能解决您的问题(对我而言),这也可能有所帮助:
我的问题是我使用 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)
【讨论】:
【参考方案11】:你应该设置响应编码在你写你的答案在响应中。
可以是annotation、response.setContentEncoding(String s),甚至是response.setHeader(String s1, String s2)。
一旦您开始使用响应输出或写入器,定义或猜测的编码将用于对结果二进制数据中的字符进行编码。这就是为什么您以后无法选择更改它的原因。
【讨论】:
以上是关于JSON 字符编码的主要内容,如果未能解决你的问题,请参考以下文章
编码 4 字节 UTF-8 字符 ????从 Rails 到 JSON 产生无效字符