繁体   English   中英

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

[英]How does Java fit a 3 byte Unicode character into a char type?

所以Java中的'char'是2个字节。 (可以从这里验证。)

我有这个示例代码:

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:如果我用UTF-16 BE编码打开文件“baz.txt”,我会在文本编辑器中看到€字符就好了,我觉得这很有道理。

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

Java在ram中为每个char使用2个字节,当使用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编码的char。

检查此链接: java utf8 encoding - char,string types

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

即使它需要UTF-8中的三个字节,那欧元符号也适用于此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM