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

时间:2010-11-11 21:46:39

标签: java encoding maven

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

我们有一组测试可以在Linux上构建和运行。但是当我们尝试在OS X上运行它们时,它们会失败。失败的断言是测试两个字符串相等,但有一个字符在Mac环境中似乎不是相同的字符。我很确定这只是因为文件以某种方式编码而且硬编码的预期字符串值被编码不同。我能够通过MAVEN-OPTS设置JVM file.encoding来解决其他一些编码问题,但到目前为止我一直被这个问题困扰。

结构看起来像这样: some.xml - > xslt - >宾语 assertEquals(“期望值”,object.valueToTest());

有关如何纠正这种不匹配的任何见解?或者甚至为什么它会在第一时间发生?

xml文件上的标题表示它是以UTF-8编码的,但文件可能在文件系统上的编码方式不同。有没有办法让我检查实际的编码是什么?

4 个答案:

答案 0 :(得分:1)

它发生的通常原因是如果有人使用旧字符串< - >字节转换,不带参数来指定编码。

这不是一个源文件中的编码问题,虽然我只是在Windows和Linux之间移动所以我从未见过它,但你应该使用Unicode转义为U00007f以上的任何代码点。 / p>

答案 1 :(得分:1)

如果另一个平台使用不同的编码读取字符,您可能会看到这样的故障。

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

This page还提供了另一条线索,说明为什么这可能不起作用。 Mac上的默认编码是“MacRoman”,它不是UTF-8的子集。因此,正如您所怀疑的那样,角色的解释可能不同。

答案 2 :(得分:1)

主要是what Pete Kirkham said

  

我能够通过MAVEN-OPTS设置JVM file.encoding来解决其他一些编码问题

不要这样做; it is not supported and may have unintended side-effects

specify source file encoding的正确方法是在pom.xml文件中。

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

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

有关源文件here中的编码的更多信息。

答案 3 :(得分:1)

如果XML文件以<?xml ... encoding="UTF-8"?>开头,那么您可以相当确信它在文件系统上编码为UTF-8。否则,在编辑器中打开它,让您看到原始字节是什么,例如emacs M-x find-file-literally

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

编辑:关闭主题,但这让我想起了我在测试用例中找到的一个奇怪的文件。它是一个编码为ascii / utf-8的XML文件,但编码标签表示“UTF-16”。在像记事本这样没有考虑XML编码指令的简单编辑器中看起来很正常,但在将文件读作UTF-16的智能编辑器中看起来很奇怪