java-JSON字符编码
我的Java Web应用程序提交了一个AJAX请求,该请求返回JSON,例如:
{'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,我想必须有一种方法可以为每个响应设置默认字符集吗?
10个解决方案
55 votes
症状表明,最初使用UTF-8编码的JSON字符串已使用ISO-8859-1编码写入到HTTP响应中,并指示Web浏览器将其显示为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。
BalusC answered 2019-12-28T00:53:20Z
31 votes
我不知道这是否有意义,但是我使用@RequestMapping批注对其进行了修复。
@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
Lars Juel Jensen answered 2019-12-28T00:53:40Z
15 votes
首先,您发布的数据不是有效的JSON。 这将是:
{"value": "aériennes"}
请注意双引号:它们是必需的。
JSON数据的Content-Type应该为c3 89。实际的JSON数据(上面已包含)应使用UTF-8,UTF-16或UTF-32进行编码-我建议使用UTF-8。
您可以使用Wireshark之类的工具监视网络流量并查看数据外观,您应该看到é的字节c3 89。 我从来没有使用过Spring,但是如果它正在执行JSON编码,那么可能会为您妥善处理。
JSON到达浏览器后,如果有效,则应该良好。 但是,如何将JSON响应中的数据插入网页?
Thanatos answered 2019-12-28T00:54:19Z
8 votes
终于我得到了解决方案:
只把这行
@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")
这肯定会有所帮助。
AbdulHayee answered 2019-12-28T00:54:47Z
5 votes
我发生的事情与此完全相同:
但这对我有用:
尝试添加
;charset=UTF-8
到您的contentType。
Jorge Carretero answered 2019-12-28T00:55:20Z
3 votes
response.setContentType("application/json;charset=utf-8");
ton answered 2019-12-28T00:55:35Z
1 votes
尽管答案并不完全相关,但这里的答案帮助我解决了我的问题。我使用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依赖项。
Alexandre Pimentel answered 2019-12-28T00:56:05Z
0 votes
如果您使用的是StringEntity,请使用选择的字符编码尝试一下。 它也处理外来字符。
craned answered 2019-12-28T00:56:25Z
0 votes
另外,您可以在控制器类上方使用spring注释RequestMapping来在所有响应中接收application / json; utf-8
@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
...
}
Yuri Gavrysh answered 2019-12-28T00:56:45Z
0 votes
如果上述建议的解决方案不能解决您的问题(就我而言),这也可能会有所帮助:
我的问题是我在使用Springs @ResponseBody的响应中返回了json字符串。如果您也这样做的话,这可能会有所帮助。
将以下bean添加到调度程序servlet中。
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
class="org.springframework.http.converter.StringHttpMessageConverter">
text/plain;charset=UTF-8
(在这里找到:[http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8)]
Erando answered 2019-12-28T00:57:18Z