gpt4 book ai didi

java - Java 如何将 3 字节的 Unicode 字符放入 char 类型?

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:13 24 4
gpt4 key购买 nike

所以 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:如果我打开编码为 UTF-16 BE 的文件“baz.txt”,我会在我的文本编辑器中看到 € 字符,我想这是有道理的。

最佳答案

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

Java 在 ram 中为每个字符使用 2 个字节,当使用 UTF-8 对字符进行“序列化”时,它们可能会在生成的字节数组中产生一个、两个或三个字节,这就是 UTF-8 编码的工作原理。

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

如果您没有将参数值传递给 String.getBytes(),它会返回一个字节数组,其中包含使用底层操作系统的默认字符集编码的字符串内容。如果您想确保使用 UTF-8 编码的数组,则需要改用 getBytes("UTF-8")。

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

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

关于java - Java 如何将 3 字节的 Unicode 字符放入 char 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34922333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com