根据此文档(http://java.sun.com/docs/books/jls/third_edition/html/lexical.html,3.10.6),OctalEscape 将被转换为 unicode 字符。现在我遇到了问题,以下代码将导致 2 字节的 Unicode 字符包含错误信息。
for (byte b : "\222".getBytes()) {
System.out.format("%02x ", b);
}
结果是“c2 92”。我只期望“92”,因为这将是从 222 八进制到十六进制 (92) 的转换值。 如果我用一个字符测试它,字节信息是正确的。
System.out.format("%02x ", (byte)'\222');
一个字节的结果是“92” 在使用 Java/c 1.6.0_18 的 Linux 上,我的默认编码是“UTF-8”。
我的问题的背景是,我正在寻找一种方法将八进制转义字符串从输入编码 Cp1252 转换为 UTF-8。由于将八进制转义字符串转换为 2 个字节而失败。 有人知道为什么总是有一个额外的字节“c2”被添加到 char 数组吗?一个简单的计数表明,数组中只有一个字符。
System.out.println("\222".toCharArray().length); // will result in "1"
感谢您的提示。
更新: 正如 BalusC 提到的,八进制转义值被解释为 UTF-8 值,这会产生问题。只要这个值保存在源代码 (UTF-8) 中,我就不可能用其他编码读入这个字符串。我是对的?如果我读取 Cp1252 编码的文件,我必须使用正确的字符集声明 InputReader 的字符集,并对 UTF-8 进行编码以处理并将读取的内容保存为 UTF-8。
最佳答案
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);
}
根据您的更新
更新:
As long as this value is saved in the source code (UTF-8) I have no possibility to read in this string with an other encoding. I'm right?
没错。您需要使用与保存文件时相同的编码来读取文件,否则您可能会遇到 mojibake 的风险。 .
If I read an Cp1252 encoded file, I have to declare the charset of the InputReader with the correct charset and do an encoding to UTF-8 to process and save the read content as UTF-8.
只需使用 InputStreamReader
将文件读取为 CP1252。当读取为字符(字符串)时,Java 会将其隐式存储为 Unicode (UTF-16)。您可以将数据视为 Unicode。无需引入中间 UTF-8 文件步骤。如果要保存文件,请使用带有所需字符集的 OutputStreamWriter
,这可能与 CP1252 不同。请记住,字符集未涵盖的任何字符都将以 ?
结束。
另见:
关于java - Java中的八进制转义导致错误的字节值,编码问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4005035/