字符串UTF8编码问题

时间:2012-02-25 15:04:38

标签: java

以下简单测试失败:

assertEquals(myStringComingFromTheDB, "£");

,并提供:

Expected :£
Actual   :£

我不明白为什么会发生这种情况,特别是考虑到实际字符串(指定为第二个参数的字符串)的编码是错误的。 java文件保存为UTF8。

以下代码:

System.out.println(bytesToHex(myStringComingFromTheDB.getBytes()));
System.out.println(bytesToHex("£".getBytes()));

输出:

C2A3
C382C2A3

任何人都可以解释我为什么吗?

谢谢。

更新:我在Windows 7下工作。

更新2:它与JUnit无关,以下简单示例:

byte[] bytes = "£".getBytes();
for(byte b : bytes)
{
    System.out.println(Integer.toHexString(b));
}

输出:

ffffffc3
ffffff82
ffffffc2
ffffffa3

更新3: 我在IntelliJ Idea工作,我已经检查了选项,编码是UTF8。此外,它写在底部栏中,当我选择并右键单击井号时,它会显示"编码(自动检测):UTF-8"。

更新4: 使用十六进制编辑器打开java文件,正确保存井号," C2A3"。

1 个答案:

答案 0 :(得分:2)

请注意assertEquals按以下顺序接受参数:

assertEquals(expected, actual)

所以在你的情况下来自DB的字符串是可以的,但是你的Java类中的字符串不是(正如你已经注意到的那样)。 我想你是从某个地方复制了£ - 可能还有一些奇怪的字符,你的编辑器(IDE)没有打印出来(几乎可以肯定)。我有几次类似的问题,特别是当我在MS Windows上工作时:例如ctrl + c& ctrl + v从网站到IDE。

(我用UTF8编码在系统上打印了£的字节,这是C2A3):

for (byte b: "£".getBytes()) {
  System.out.println(Integer.toHexString(b));
}

另一种解决方案可能是您的文件不是真正的UTF-8编码。你在Windows或其他操作系统上工作吗?

根据问题编辑的其他一些可能的解决方案:

1)IDE可能会使用其他一些编码。对于eclipse,请参阅此主题:http://www.eclipse.org/forums/index.php?t=msg&goto=543800&

2)如果IDE设置和最终文件编码都没问题,那么它的编译器问题就好了。看到: Java compiler platform file encoding problem