【问题标题】:JSON character encodingJSON 字符编码
【发布时间】: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,我猜肯定有办法为每个响应设置默认字符集?

【问题讨论】:

    标签: java json spring-mvc character-encoding


    【解决方案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"})
      

      【讨论】:

      【解决方案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】:

                      你应该设置响应编码你的答案在响应中。

                      可以是annotationresponse.setContentEncoding(String s),甚至是response.setHeader(String s1, String s2)

                      一旦您开始使用响应输出或写入器,定义或猜测的编码将用于对结果二进制数据中的字符进行编码。这就是为什么您以后无法选择更改它的原因。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2013-03-12
                        • 2013-04-18
                        • 1970-01-01
                        • 2015-09-27
                        • 2012-07-15
                        • 2013-06-07
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多