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

标签 java linux encoding utf-8

根据此文档(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()没有指定编码的调用将使用平台默认编码将字符转换为字节。由于 c2multibyte 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/

相关文章:

php - 使用 Excel 查看用 PHP 创建的 CSV 文件

c# - WebService SOAP 编码 UTF-16 而不是 UTF-8

java - 谷歌地图 API v2 抛出 java.lang.runtimeexception : unable to start activity java. lang.nullpointerexception

java - 从底部滑动菜单,就像在 Dropbox 中一样

php - 如何在 PHP 脚本交互中输入重音词?

linux - 如何测试网络内核模块的 tx_timeout 操作?

C# Raspberry pi Linux 串行端口权限即使作为 root 也被拒绝

python - 删除表语句中的 Hive ParseException

java - 错误: malformed record literal: - JDBC insert data with self defined type array

java - 将条目插入ElasticSearch的最佳方法是什么?