Java如何将3字节Unicode字符装入char类型?

时间:2016-01-21 11:16:59

标签: java unicode utf-8

所以' char'在Java中是2个字节。 (可以从here验证。)

我有这个示例代码:

public class FooBar {
    public static void main(String[] args) {
        String foo = "€";
        System.out.println(foo.getBytes().length);
        final char[] chars = foo.toCharArray();
        System.out.println(chars[0]);
    }
}

输出如下:

3
€

我的问题是,Java如何将3字节字符装入char数据类型?顺便说一句,我正在使用参数运行应用程序:-Dfile.encoding = UTF-8

此外,如果我进一步编辑代码并添加以下语句:

File baz = new File("baz.txt");
final DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(baz));
dataOutputStream.writeChar(chars[0]);
dataOutputStream.flush();
dataOutputStream.close();

最终文件" baz.txt"将只有2个字节,即使我将其视为UTF-8文件,它也不会显示正确的字符。

编辑2: 如果我打开文件" baz.txt"使用UTF-16 BE编码,我会在文本编辑器中看到€字符很好,我猜是有意义的。

2 个答案:

答案 0 :(得分:8)

String.getBytes()使用平台的默认字符编码返回字节,该编码不一定与内部表示匹配。

当每个字符都使用ram中的2个字节的Java时,字符串是"序列化的"使用UTF-8,它们可能在结果字节数组中产生一个,两个或三个字节,这就是UTF-8编码的工作原理。

您的代码示例使用的是UTF-8。 Java字符串使用UTF-16编码在内存中。不适合单个16位字符的Unicode代码点将使用称为代理项对的2字符对进行编码。

如果未将参数值传递给String.getBytes(),它将返回一个字节数组,该数组具有使用底层操作系统的默认字符集编码的String内容。如果你想确保一个UTF-8编码的数组,那么你需要使用getBytes(" UTF-8")。

调用String.charAt()仅从String的内存存储中返回原始的UTF-16编码字符。

点击此链接:java utf8 encoding - char, string types

答案 1 :(得分:7)

Java使用UTF-16(16位)进行内存中表示。

即使在UTF-8中需要三个字节,欧元符号也适合它。