问题:理论是2字节(汉字 字母)。UTF-8时new String("字").getBytes().length 返回3
一、R大回答:
分清楚内码(internal encoding)、外码(external encoding)
内码:程序内部用的字符编码,实现char、String类型内存里用内部编码;
规定内码UTF-16。或让用户无感知到String用非UTF-16
外码:程序与外部交互用字符编码。不是内存用都是“外部”。如,序列化后char或String,或外部文件、命令行参数。
规定外码UTF-8。Class的字符串常量、符号名字也是。为了平衡运行时的时间效率(定长UTF-16)与外部存储空间效率(变长UTF-8)做取舍。
Java语言规范规定,char是UTF-16的code unit,也就是一定是16位(2字节);
答:String.getBytes():内码转指定外码。外码UTF-8,得到byte[]外码性质
题外话:
(1)JavaScript用UTF-16作为内码,“压缩字符串”用ASCII内码字符串,用户只能看到UTF-16 code unit。
(2)UTF-16:大部分定长2字节,偶尔4,无法兼容于ASCII编码
二、回答:脱离具体编码谈某个字符占几个字节,没意义
1、同一个字符 不同编码,占不同字节
(1)抽象整数“42”占几个字节?
byte 存 1 字节(有限位数,256 无法存),short 2,int 4,long 8 字节
“字”GBK 2 ,UTF-16 2 ,UTF-8 3,UTF-32 4 字节
2、不同字符,同编码下,占不同字节
UTF-8 变长:“字”3字节,“A” 1 字节。
new String("字").getBytes("GBK").length ”,返回2