Java:多平台字符串编码问题

Java:多平台字符串编码问题,java,encoding,maven,Java,Encoding,Maven,我有一个奇怪的情况,我还没有想出如何处理。我们有开发人员在多个平台上工作,主要平台是linux,但我们也有人在OS X和Windows上工作 我们有一组在Linux上构建并运行良好的测试。但当我们试图在OSX上运行它们时,它们失败了。失败的断言是测试两个字符串是否相等,但在Mac环境中有一个字符似乎不是相同的字符。我相当肯定这仅仅是因为文件是以某种方式编码的,而预期的字符串值(硬编码的)是以不同的方式编码的。通过MAVEN-OPTS设置JVM file.encoding,我可以解决一些其他编码问

我有一个奇怪的情况,我还没有想出如何处理。我们有开发人员在多个平台上工作,主要平台是linux,但我们也有人在OS X和Windows上工作

我们有一组在Linux上构建并运行良好的测试。但当我们试图在OSX上运行它们时,它们失败了。失败的断言是测试两个字符串是否相等,但在Mac环境中有一个字符似乎不是相同的字符。我相当肯定这仅仅是因为文件是以某种方式编码的,而预期的字符串值(硬编码的)是以不同的方式编码的。通过MAVEN-OPTS设置JVM file.encoding,我可以解决一些其他编码问题,但到目前为止,我一直被这个问题难住了

结构看起来像这样: some.xml-->xslt-->对象 assertEquals(“预期值”,object.valueToTest())

有没有关于如何纠正这种不匹配的见解?或者甚至为什么它会首先发生


xml文件的头表示它是用UTF-8编码的,但文件系统上的编码可能不同。是否有办法检查实际编码是什么?

发生这种情况的通常原因是,如果有人使用旧的字符串字节转换,而该转换不使用参数来指定编码


源文件中的编码问题并非不可能,尽管我只在Windows和Linux之间移动过,所以我从未见过它,但对于U00007f以上的任何代码点,您都应该使用Unicode转义。

如果其他平台使用不同的编码读取字符,您可能会看到类似的失败

文件中的字符是如何表示的?您可以尝试使用转义字符串常量中的任何unicode

还提供了另一个线索,说明这可能不起作用的原因。Mac上的默认编码是“MacRoman”,它不是UTF-8的子集。因此,正如您所怀疑的,这个字符可能会有不同的解释。

大多数情况下

通过设置JVM
file.encoding
,我可以通过MAVEN-OPTS解决一些其他编码问题

不要这样做

正确的方法是在pom.xml文件中

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

...
UTF-8
...
这确保了编译器将在所有平台上一致地解码源文件,这相当于使用
javac-encoding X…


更多关于在源文件中编码的信息。

如果XML文件以
开头,那么您可以确信它在文件系统中编码为UTF-8。否则,请在编辑器中打开它,以便查看原始字节是什么,例如emacs M-x
按字面意思查找文件

或者,您的java源代码可能在字符串文本中有一个有趣的字节,它在不同的编码中以不同的方式表示。我认为编译器使用默认的平台编码读取源代码。要解决此可移植性问题,可以使用\uxxx表示法对任何非ascii字符进行编码。这对母语为英语的用户来说很好,但对其他人来说可能有点烦人

编辑:脱离主题,但这让我想起了我在测试用例中工作时发现的一个奇怪的文件。这是一个编码为ascii/utf-8的XML文件,但编码标签上写着“utf-16”。在记事本这样的简单编辑器中,它看起来很正常,没有考虑XML编码指令,但在将文件读取为UTF-16的智能编辑器中,它看起来很奇怪