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

Java 编码问题-我认为UTF-8被视为ISO-8859-1,java,spring,utf-8,character-encoding,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); 响应可能包含以某种方式被编码为不正确的外来字符。 离开上述服务时响应的一部分示例: 但当它到达外部应用程序时,它正在以某

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

@GET
@Path("eventBir")
@Produces(MediaType.APPLICATION_XML)
public String getEventsBir(
        @QueryParam("applicationId") String applicationId);
响应可能包含以某种方式被编码为不正确的外来字符。

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

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

我发现这似乎已经明确了我的问题。看起来我得到了一个UTF-8编码的字符串,并将它通过一些编码为ISO-8859-1的代码传递。然而,我正在努力解决如何着手修复它

在我的服务返回字符串之后,字符串将通过我认为是Spring创建的代码来包装web服务。它也可能被网络服务器弄坏了,我不确定

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

编辑:找到了有问题的Spring类

看起来web服务的Spring包装中有问题的类是
StringHttpMessageConverter

在Grep代码中

在这个类“ISO-8859-1”中定义了一个默认字符集,这就是解析响应(在UTF-8中)的原因,因此我以上述问题结束


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

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

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

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

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

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

@Produces("application/json; charset=utf-8")
而不是:

@Produces(MediaType.APPLICATION_XML)

您在哪个servlet容器上?@SotiriosDelimanolis TC Server 2.9.4.Release我想让您发布一个小示例,我们可以重现您如何生成方法返回的对象。@SotiriosDelimanolis我在Spring中找到了有问题的类。基本上,Spring将字符串包装到HTTP响应中,而该类使用的是导致我们出现问题的默认字符集。您可以添加有关您的环境的更多详细信息吗?你在用球衣吗?你能给我们你的Spring上下文配置吗?你能举一个
String
你的
getEventsBir
返回的例子吗?首先,我想你的答案是
application.xml
。此外,这也是我在处理这个问题时尝试过的。看起来javax-ws注释不是这样工作的。不过,Spring注释
@ResponseMapping
似乎允许这种行为。