奇怪的字符编码
Strange character encoding
我有一个项目在 Linux 上的 WebSphere Liberty 上运行。
我的语言是巴西葡萄牙语,我们有一些重音词。
我的 java 代码设置了一些用户消息,如下所示:
...
ErroResponse erroResponse = new ErroResponse();
erroResponse.setMensagem("Esse grupo não pode ser criado. Já existe um grupo criado com esse nome.");
response = Response.status(Status.BAD_REQUEST).entity(erroResponse).build();
...
当向用户显示相同的消息时,它看起来是这样的:
我认为这不是浏览器编码问题,因为消息在我的服务器日志中看起来是一样的。
我尝试使用 -Dclient.encoding.override 设置 JVM 编码
-Dfile.encoding 到 ISO-8859-1 和 UTF-8,没有成功。
同一项目 运行 在 Windows 服务器上运行没有问题,显示带有正确重音的消息。
只有直接写在源码里的message才会有这个问题。来自数据库查询结果的重音词正确呈现。
我正在使用 Suse 11.4。
非常感谢任何帮助。
谢谢
尝试检查您的 Suse 编码和语言,方法是:
$ echo $LC_CTYPE
ISO-8859-1
$ echo $LANG
pt_BR
获取所有语言:
$ locale -a
改为pt_PT.utf8:
$ export LC_ALL=pt_PT.utf8
$ export LANG="$LC_ALL"
很可能在添加这些 JVM 编码属性之前,您在响应中获得了该字符的 UTF-8 编码,但您的浏览器不愿意将它们解释为 UTF-8。我建议删除它们并将其保留在您的 JAX-RS 资源中。
一个有用的调试步骤是使用客户端和十六进制编辑器(如 od -t x1
)之类的命令查看响应,因为有很多东西可以掩盖实际传输的数据(浏览器、终端仿真器)等)。
如果您明确告诉服务器使用字符集(UTF-8 或本地代码页,如 ISO8859-1),您的字符串将被转换为指定的代码页。浏览器还将在 Content-Type header.
中看到字符集
最简单的方法是在 JAX-RS 中使用 @Produces,如:
@Produces("text/html; charset=UTF-8")
或
@Produces("text/html; charset=ISO8859-1")
更改项目文本编码后问题已解决。默认情况下,eclipse 将源代码保存为 UTF-8,javac 将其编译为 CP1252(Windows 默认)。
要进行此更改,我必须右键单击项目 -> 属性 -> 资源,然后将文本文件编码更改为其他 (ISO-8859-1)。
我在 maven 和 jax-ws 服务中遇到过类似的问题,它们返回错误字符(源代码中的文本)。
通过将此添加到父 Maven 项目来解决它:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
我有一个项目在 Linux 上的 WebSphere Liberty 上运行。 我的语言是巴西葡萄牙语,我们有一些重音词。 我的 java 代码设置了一些用户消息,如下所示:
...
ErroResponse erroResponse = new ErroResponse();
erroResponse.setMensagem("Esse grupo não pode ser criado. Já existe um grupo criado com esse nome.");
response = Response.status(Status.BAD_REQUEST).entity(erroResponse).build();
...
当向用户显示相同的消息时,它看起来是这样的:
我认为这不是浏览器编码问题,因为消息在我的服务器日志中看起来是一样的。
我尝试使用 -Dclient.encoding.override 设置 JVM 编码 -Dfile.encoding 到 ISO-8859-1 和 UTF-8,没有成功。
同一项目 运行 在 Windows 服务器上运行没有问题,显示带有正确重音的消息。
只有直接写在源码里的message才会有这个问题。来自数据库查询结果的重音词正确呈现。
我正在使用 Suse 11.4。
非常感谢任何帮助。
谢谢
尝试检查您的 Suse 编码和语言,方法是:
$ echo $LC_CTYPE
ISO-8859-1
$ echo $LANG
pt_BR
获取所有语言:
$ locale -a
改为pt_PT.utf8:
$ export LC_ALL=pt_PT.utf8
$ export LANG="$LC_ALL"
很可能在添加这些 JVM 编码属性之前,您在响应中获得了该字符的 UTF-8 编码,但您的浏览器不愿意将它们解释为 UTF-8。我建议删除它们并将其保留在您的 JAX-RS 资源中。
一个有用的调试步骤是使用客户端和十六进制编辑器(如 od -t x1
)之类的命令查看响应,因为有很多东西可以掩盖实际传输的数据(浏览器、终端仿真器)等)。
如果您明确告诉服务器使用字符集(UTF-8 或本地代码页,如 ISO8859-1),您的字符串将被转换为指定的代码页。浏览器还将在 Content-Type header.
中看到字符集最简单的方法是在 JAX-RS 中使用 @Produces,如:
@Produces("text/html; charset=UTF-8")
或
@Produces("text/html; charset=ISO8859-1")
更改项目文本编码后问题已解决。默认情况下,eclipse 将源代码保存为 UTF-8,javac 将其编译为 CP1252(Windows 默认)。
要进行此更改,我必须右键单击项目 -> 属性 -> 资源,然后将文本文件编码更改为其他 (ISO-8859-1)。
我在 maven 和 jax-ws 服务中遇到过类似的问题,它们返回错误字符(源代码中的文本)。
通过将此添加到父 Maven 项目来解决它:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>