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

2022-09-04 02:23:51

因此,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”,我会在我的文本编辑器中看到€字符,我想这是有道理的。


答案 1

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

Java在ram中使用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编码 - 字符,字符串类型


答案 2

Java 使用 UTF-16(16 位)作为内存中表示形式。

欧元符号符合这一点,即使它需要三个字节的UTF-8。


推荐