奇怪的字符编码

3

我有一个在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();
...

当相同的消息显示给用户时,它看起来是这样的:enter image description here 我不认为这是浏览器编码问题,因为该消息在我的服务器日志中看起来相同。
我尝试使用-Dclient.encoding.override -Dfile.encoding设置JVM编码为ISO-8859-1和UTF-8,但没有成功。
同一项目在Windows服务器上运行时没有问题,并正确地显示带有重音符号的消息。
只有直接写入源代码的消息才会出现此问题。来自数据库查询结果的带重音符号的单词将被正确呈现。
我正在使用Suse 11.4。
非常感谢您的帮助。
谢谢。

1
可能的一个(不太可能的)原因是Java源代码被编辑为UTF-8,但编译为例如ISO-8859-1。(在JSP中更常见。)尝试使用\u00E3而不是ã来检查这个问题。 - Joop Eggen
如何强制编译成UTF-8而不是ISO-8859-1? - Ranieri Mazili
@JoopEggen 你说得对。在看到你的评论后,我找到了解决方案。谢谢。 - Ranieri Mazili
4个回答

0
问题已经通过更改项目文本编码得到解决。默认情况下,Eclipse将源代码保存为UTF-8格式,而javac将其编译为CP1252(Windows默认格式)。
要进行此更改,我必须右键单击项目->属性->资源,然后将文本文件编码更改为其他(ISO-8859-1)。

如果您使用Maven或类似的构建工具,则正确编码的声明应放在pom.xml(Maven)或build.properties(Gradle)或build.xml(Ant)文件中,以便它可以在重新安装Eclipse后继续存在。 - Roland Illig

0

尝试通过以下方式检查您的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"

我已经尝试设置为pt_BR.utf8和en_US.iso885915,但仍然没有成功。 - Ranieri Mazili

0

在添加JVM编码属性之前,您很可能会在响应中得到该字符的UTF-8编码,但是您的浏览器不愿意将它们解释为UTF-8。我建议删除它们并将其保留在您的JAX-RS资源中。

一个有用的调试步骤是使用类似于客户端和十六进制编辑器(如od -t x1)的命令查看响应,因为有许多东西可以混淆实际传输的数据(浏览器、终端仿真器等)。

如果您明确告诉服务器使用字符集(UTF-8或本地代码页,如ISO8859-1),则您的字符串将被转换为指定的代码页。浏览器还将在Content-Type标头中看到字符集。

最简单的方法是在JAX-RS中使用@Produces,如下所示:

@Produces("text/html; charset=UTF-8")

或者

@Produces("text/html; charset=ISO8859-1")

0

我曾经遇到过类似的问题,使用maven和jax-ws服务时返回了源代码中的错误字符。

通过将以下内容添加到父级maven项目中解决了这个问题:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

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