【问题标题】:Encoding Issues - I think UTF-8 is being treated as ISO-8859-1编码问题 - 我认为 UTF-8 被视为 ISO-8859-1
【发布时间】:2014-03-27 18:57:28
【问题描述】:

我有一个使用 javax ws 注释定义的 Web 服务来定义服务端点,如下所示:

@GET
@Path("eventBir")
@Produces(MediaType.APPLICATION_XML)
public String getEventsBir(
        @QueryParam("applicationId") String applicationId);

响应可能包含被编码为不正确的外来字符。

离开上述服务时的部分响应示例:

<Market name="Apuestas con hándicap en vivo">

但是当它到达外部应用程序时,它正在以某种方式被编码以提供:

<Market name="Apuestas con hándicap en vivo">

我发现this website 似乎已经定义了我的确切问题。所以看起来我得到了一个 UTF-8 编码的字符串,并通过一些将其编码为 ISO-8859-1 的代码传递它。但是,我正在努力解决如何修复它。

在我的服务返回字符串后,该字符串通过我认为是 Spring 创建的代码传递,以包装 Web 服务。它也可能被网络服务器破坏,我不确定。

在返回字符串之前,我可以对字符串进行一些编码吗?或者是否可以设置一些 Spring 配置来将响应设置为 UTF-8 编码?

编辑:找到有问题的 Spring Class

看起来 Web 服务的 Spring 包装器中的违规类是 StringHttpMessageConverter

Here's the class 在 Grep 代码中

在“ISO-8859-1”这个类中定义了一个默认字符集,这就是解析响应的内容(在 UTF-8 中)所以我最终解决了上述问题。

所以现在我正在寻找解决此问题的好方法。

【问题讨论】:

  • 你在哪个 servlet 容器上?
  • @SotiriosDelimanolis TC 服务器 2.9.4.RELEASE
  • 我希望您发布一个小示例,我们可以重现您如何生成方法返回的对象。
  • @SotiriosDelimanolis 我在 Spring 中发现了有问题的课程。基本上,Spring 将 String 包装到 HTTP 响应中,并且该类使用导致我们问题的默认字符集。
  • 您能否添加有关您的环境的更多详细信息?你用的是泽西岛吗?你能给我们你的 Spring 上下文配置吗?你能举一个String你的getEventsBir退货的例子吗?

标签: java spring utf-8 character-encoding iso-8859-1


【解决方案1】:

由于返回的 XML 字符串没有定义编码,Spring 使用默认的 StringHttpMessageConverter 将所有内容编码为 ISO-8859-1,因为当没有指定其他值时,这是 HTTP 响应的默认值。

看起来StringHttpMessageConverter 类可以使用提供的字符集进行实例化。然后可以在服务的整体网关上进行设置,以便所有端点都使用所需的字符集。

派生的解决方案是在 Spring Context 中创建一个,如下所示:

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
    <constructor-arg index="0" ref="utf8Charset"/>
</bean>

<bean id="utf8CharsetFactory" class="CharsetFactory"/>
<bean id="utf8Charset" factory-bean="utf8CharsetFactory" factory-method="createUTF8Charset"  /> 

然后在网关中使用它,如下所示:

<http:outbound-gateway request-channel="requestChannel"
    url-expression="'${bir.xml.url}' + payload.toString()" http-method="GET"
    extract-request-payload="true" expected-response-type="java.lang.String"
    charset="UTF-8" reply-timeout="30000" reply-channel="dtdRemovingTransformerChannel"
    message-converters="stringHttpMessageConverter"
    mapped-response-headers="Date, Server, Pragma, Cache-Control, SVRID, last-modified">
</http:outbound-gateway>

显然,这将 UTF-8 编码应用于仅返回字符串的任何地方,但这在应用程序中是可以接受的。

【讨论】:

    【解决方案2】:

    尝试使用您的服务生成 utf-8:

    @Produces("application/json; charset=utf-8")
    

    代替:

    @Produces(MediaType.APPLICATION_XML)
    

    【讨论】:

    • 首先,我认为您的回答是application.xml。此外,这是我在解决这个问题时尝试过的。看起来 javax ws 注释不像这样工作。不过,Spring 注释 @ResponseMapping 似乎允许这种行为。
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多