【问题标题】:String UTF8 encoding issue字符串 UTF8 编码问题
【发布时间】:2012-02-25 15:04:37
【问题描述】:

以下简单测试失败:

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”。

【问题讨论】:

    标签: java


    【解决方案1】:

    请注意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

    【讨论】:

    • 感谢您的回答,@PiotrekDe。我对 ctrl+c 和 ctrl+v 也有同样的想法,但是我用键盘手动输入它,我仍然面临这个问题。我使用的是 Windows 7。这个问题真的很奇怪,让我感到害怕!
    • 所以您的文件可能不是真正的 UTF8 编码?你使用一些 IDE 吗?如果是 Eclipse,您可以从 Windows > Preferences > General > Content Types 为新文件设置默认编码)。看到这个线程:eclipse.org/forums/index.php?t=msg&goto=543800&
    • 因此,如果它不是键盘、IDE 和文件,最后的机会就是编译器 :) :stackoverflow.com/questions/4927575/…
    • 你是对的,现在它工作得很好!我检查了编译器,由于某种原因,它使用了aspectjtools-1.6.10.jar 而不是javac。我还添加了参数-encoding UTF-8。如果您更改答案或添加新答案,我会 +1 并接受它:) 谢谢!
    • 如果 UTF-8 编码是文件格式规范的一部分,使用 myStringComingFromTheDB.getBytes("UTF-8") 会更安全。无参数 String.getBytes() 使用平台编码,因此不同机器上的结果可能不同,并且您冒着出现棘手错误的风险(例如,一切可能在开发机器上正常工作,但在机器意外使用不同语言环境的生产环境中停止工作)。相反的操作也是如此,即从字节数组创建一个字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多