Java é;成为&;195;#169然后变成é;如何解决此编码问题?

Java é;成为&;195;#169然后变成é;如何解决此编码问题?,java,xml,character-encoding,pdf-generation,maven,Java,Xml,Character Encoding,Pdf Generation,Maven,我在Eclipse中有一个java文件,它是UTF-8格式的,有一些字符串包含重音符号 在java文件本身中,重音被写入并保存为é。 在使用velocity生成的xml中,é变为和#195© 在使用fop和xsl模板生成的pdf中,输出显示为é 所以这可能是一个编码问题,所有内容都应该使用UTF-8。奇怪的是,在我运行应用程序的eclipse环境(windows)中,整个过程在本地运行,正确的重音显示在pdf中 但是,当应用程序使用maven构建并部署到(unix环境)时,我看到了上

我在Eclipse中有一个java文件,它是UTF-8格式的,有一些字符串包含重音符号

在java文件本身中,重音被写入并保存为é。 在使用velocity生成的xml中,é变为
和#195©
在使用fop和xsl模板生成的pdf中,输出显示为é

所以这可能是一个编码问题,所有内容都应该使用UTF-8。奇怪的是,在我运行应用程序的eclipse环境(windows)中,整个过程在本地运行,正确的重音显示在pdf中


但是,当应用程序使用maven构建并部署到(unix环境)时,我看到了上述问题

也许Eclipse编译文件时使用的是与Maven不同的
javac
命令行

编译Java时,必须告诉编译器源文件的编码(如果源文件包含非ASCII字符且默认值不起作用)

我认为在Maven中解决这个问题的方法是将它添加到pom.xml文件中:

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

...
UTF-8
...
(我是从你那儿得到的。)


相反,您可以通过在Java文件中使用丑陋的Unicode转义序列来完全避免编码问题<代码>é
将变成
\u00e9
。对人类更坏,对烤面包机更容易。(正如Perlis所说,“在人机共生中,必须由人来调整:机器不能。”

不确定Maven/Velocity/PDF生成器部件,但这听起来很像是传输到Unix时没有将基于文本的文件视为UTF-8。在Unix中的支持UTF-8的编辑器中打开这些文件,并查看是否排除其中一个和另一个。这是一个次要问题,但java文件通常是UCS-2或UTF-16编码的。@GaryF:我认为您对.java文件编码和JVM的内部字符串表示法有点混淆。java文件只是一个文本文件,没有元数据,其编码完全取决于用于创建文件的编辑器。例如,如果我在IntelliJ IDEA(我选择的Java IDE)中键入一个“é”并保存该文件,默认情况下,它将保存为UTF-8文件。除此之外,,我很难记起上次我看到一个编码为UCS-2的.java文件。在eclipse中,你可以右键单击一个java文件,然后选择任何文本文件编码,包括UTF-8。@Ayrad:我在这里写过,包含非ASCII字符的字符串应该外部化到文件中,而不是直接放在.java文件中,否则你会有很多错误问题,包括但不限于有问题的批处理/脚本编写、将文件传输到各种操作系统、IDE、文本编辑器或从中传输文件时的编码问题。有些人在理解这一事实时遇到问题。出于好奇,如果在.java源文件中使用\u00E9转义,会发生什么?这并不能解释为什么它在Windows中本地工作。据我所知,构建/编译发生在Windows上,然后文件被传输到Unix。不过,使用unicode转义是一个很好的建议,可以作为解决方案/预防措施。@BalusC我的理论是Eclipse版本不同于Maven版本。+1。。。确切地Unicode转义序列和字符串外部化(如果需要的话)。啊,我认为当您在Eclipse中使用Maven时,它将由Maven构建。但我不应该考虑Maven,因为我不使用它:)关于这一点,你可能确实是对的。(我责怪Java语言的设计者没有指定文件使用的编码,责怪javac设计者使用特定于平台的默认编码。事后看来,很明显,Java源文件的含义应该与平台无关。Oops。)
<project>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  ...
</project>