java - 编码问题 - 我认为 UTF-8 被视为 ISO-8859-1

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

我有一个使用 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 类

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

Here's the class在 Grep 代码中

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

所以现在我正在寻找一种好方法来解决这个问题。

最佳答案

由于返回的 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 编码,但这在应用程序中是可以接受的。

关于java - 编码问题 - 我认为 UTF-8 被视为 ISO-8859-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22696741/

相关文章:

java - 在 Spring 中将请求参数/路径变量映射到 GET 请求中的 Dto

java - 如何修复 "Field ... required a bean of type ... that could not be found"异常 Spring Boot

xml - 是什么导致我的 XML 中断?

java - 在javascript中通过scriptEngine将多个参数传递给java函数

java - Spring 集成测试不会从其他模块获取 JPA bean

java - 谷歌的 Freebase API : Basic MQL Query and JSON Parse Example in Java?

php - 如何在 PHP 脚本中使用 UTF-8 字符?

php - 使用 PHP 和 MySQL 显示日语字符的问题

java.lang.ClassCastException : org. primefaces.model.DefaultUploadedFile 无法转换为 java.io.File

java - Html.fromHtml() 强制不删除未知标签