WebSphere 8.5.5 UTF-8编码问题

3

我在Websphere 8.5.5上遇到了一个问题,我的应用程序是一个使用spring rest框架发送邮件的应用。在我的服务中,我接收邮件详细信息并使用spring将其转发给接收者。它能正常工作,但当我尝试发送包含非ASCII字符的消息时,消息中的特殊字符会被替换成问号。使用UTF-8编码无效。在我的个人电脑上,该应用程序运行于Liberty Profile服务器上,最初也无法正常工作。我搜索了这个问题并发现spring需要一个过滤器来解释特殊字符,所以我在我的web.xml中添加了以下行:

<filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
       <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/</url-pattern>
  </filter-mapping>

在自由模式下运行良好,但是当我在Websphere上部署应用时却不行。

我尝试使用String构造函数直接将消息转换为utf-8:

new String(byteArray, "UTF-8")

同样的事情发生了。它在自由上运作,但在WebSphere上却不行。 然后我发现你可以通过添加这些JVM参数来强制WebSphere使用UTF-8:

-Dclient.encoding.override=UTF-8
-Dfile.encoding=UTF-8

如在这个答案中所解释的: websphere上的字符编码问题

我按照我在互联网上找到的许多指南所解释的设置了服务器参数并重新启动,但显然它没有起作用。

这是运行WAS的Linux机器上locale命令的输出:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

我被卡住了,不知道还能尝试什么。

非常感谢任何帮助。

1个回答

5

<PROFILE_ROOT>/properties 目录下的 encoding.properties 文件是包含编码设置的另一个位置。默认值(英语)为 en=ISO-8859-1。将其更新为 en=UTF-8 并重新启动服务器。


谢谢,我找到了文件,就像你说的那样,值是en=ISO-8859-1。现在的问题是,服务器上运行很多应用程序,它们托管在不同的虚拟服务器中。我的应用程序运行在专门为它创建的虚拟服务器中。有没有一种方法可以在单个虚拟服务器级别上设置encoding.properties?因为我不希望更改影响服务器上的所有应用程序。 - amicoderozer
@amicoderozer:1)在WAS的术语中,我不确定您所说的“虚拟服务器”一词的含义。您能否请澄清一下?2)ISO-8859-1是Unicode的一部分,因此全局UTF-8设置不会与您当前的应用程序存在任何兼容性问题。 - Haxiel
对不起,我的错,我是指应用服务器。我在想是否可以在应用服务器级别上设置另一个encoding.properties文件。好的,非常感谢您的解释。 - amicoderozer
@amicoderozer:没问题。我还没有看到一个配置文件下定义多个服务器的情况,所以我无法具体说明这种用例。由于profile_root文件夹在多个服务器之间共享,因此为每个服务器设置encoding.properties文件似乎是不可行的。 - Haxiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接