代码之家  ›  专栏  ›  技术社区  ›  DrDol

Java中的八进制转义导致错误的字节值,编码问题?

  •  2
  • DrDol  · 技术社区  · 14 年前

    根据这份文件( http://java.sun.com/docs/books/jls/third_edition/html/lexical.html

    for (byte b : "\222".getBytes()) {
         System.out.format("%02x ", b);
    }
    

    结果是“c2 92”。我只表示“92”,因为这是222八进制到十六进制(92)的转换值。 如果我用一个字符来测试,字节信息是正确的。

    System.out.format("%02x ", (byte)'\222');
    

    一个字节的结果是“92”

    我的问题的背景是,我正在寻找一种方法,将输入编码Cp1252的八进制转义字符串转换为UTF-8。由于八进制转义字符串转换为2字节,此操作失败。 有人知道为什么总是有一个额外的字节“c2”被添加到char数组中吗?一个简单的计数显示,数组中只有一个字符。

    System.out.println("\222".toCharArray().length); // will result in "1"
    

    谢谢你的提示。

    更新:

    2 回复  |  直到 14 年前
        1
  •  4
  •   BalusC    14 年前

    这个 String#getBytes() 没有指定编码的调用将使用平台默认编码将字符转换为字节。自从 c2 multibyte UTF-8 sequence ,显然您使用的是UTF-8作为平台默认编码。如果要获取CP1252字节,则需要在 String#getBytes(String charsetName) 方法。

    for (byte b : "\222".getBytes("cp1252")) {
         System.out.format("%02x ", b);
    }
    

    根据您的更新:

    没错。您需要使用与保存文件相同的编码来读取文件,否则可能会导致 mojibake .

    只需使用 InputStreamReader OutputStreamWriter 使用所需的字符集,这可能与CP1252不同。请记住,任何字符集中没有包含的字符都将以 ?

    另见:

        2
  •  3
  •   McDowell rahul gupta    14 年前

    Java中的所有字符和字符串都是UTF-16。所以,你已经输入了控制字符 U+0092 PRIVATE USE TWO

    U+2019年:'

    U+2019 RIGHT SINGLE QUOTATION MARK . 在windows-1252中,其字节值为 92 . 我不想让人失望,但是当编码为UTF-8时,它将以多字节序列结束 E2 80 99 .

    \u2019 . 我写了一篇关于用不同语言转码的博文 here 和Java源文件中的编码 here