所以' 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编码,我会在文本编辑器中看到€字符很好,我猜是有意义的。
答案 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编码字符。
答案 1 :(得分:7)
Java使用UTF-16(16位)进行内存中表示。
即使在UTF-8中需要三个字节,欧元符号也适合它。