以下简单测试失败:
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"。
答案 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