中文编码 GBK 用 2 个字节,UTF-8 用 3 个字节,
对一个只含有字符 "你" 的文件进行读取, 文件大小 3 字节。
用 FileReader.read()
读一个字符,返回 int,4 字节,装得下,
然后下一步就迷糊了,为啥强转 char 能得到 “你”?
char 不是两个字节嘛,“你” 是三个字节啊。
public class CharIO {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("a.txt"); // 你
System.out.println(fr.getEncoding()); // UTF8
System.out.println(new File("a.txt").length()); // 3
System.out.println("你".getBytes(StandardCharsets.UTF_8).length); // 3
int ch = fr.read();
System.out.println((char)ch); // 你
for (byte b : BigInteger.valueOf(ch).toByteArray()) {
System.out.println(b); // 79 96
}
for (byte b : "你".getBytes()) {
System.out.println(b); // -28 -67 -96
}
}
}
最后从字节上看,个数和值也不一样啊,中文字符编码不应该是负数的嘛?
char 是 utf16 编码的,如果你用 getBytes(UTF_16BE) 就是一样的了