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

Kor*_*gay 13 java unicode utf-8

所以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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

3
€
Run Code Online (Sandbox Code Playgroud)

我的问题是,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();
Run Code Online (Sandbox Code Playgroud)

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

编辑2:如果我用UTF-16 BE编码打开文件"baz.txt",我会在文本编辑器中看到€字符就好了,我觉得这很有道理.

Shi*_*rty 8

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


Thi*_*ilo 7

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

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

  • 是的,这有点问题,因为Unicode比那个大.一些Unicode代码点现在需要Java中的两个字符.因此,如果使用"整个目录","length"或"charAt"的结果可能并不完全令人满意. (2认同)
  • 该参数定义了默认编码,即通过调用`getBytes()`而不指定字符集得到的结果(不要这样做,总是声明字符编码). (2认同)