貌似是一个简单的问题(也许还真是简单的)但是却有时候却有点难啃
char在Java中应该是2个字节
byte在Java中应该是1个字节
char x = '编'; //这样是合法的,输出也是2个字节
但是
String str = "编";
byte[] bytes = str.getBytes(); //为什么这里bytes要占用3个字节呢?
3个字节一共是3*8=24个bits,那么str.getBytes()这个方法是怎么回事呢?
解答:
首先,要搞清楚 code point 和 encoding 的区别。Java 是遵循 unicode 4.0 标准的,而内部的 character 以 utf-16 作为 encoding。unicode 4.0 标准包含从 U+0000-U+FFFF 的基本多语言平面和 U+10000-U+10FFFF 的扩展平面的文字,这是 code point。Java 的 char 类型是 16 bit 的,所以单个 char 只支持基本平面内的文字,而扩展平面的文字是由一对 char 来表示的。而 String.getBytes() 这个方法是按照指定的 encoding 返回字符串,一般中文系统的默认编码是 utf-8 (linux, mac) 或者 gbk/gb18030 (windows)。只要是基本平面内的文字,utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的。
char在Java中应该是2个字节
byte在Java中应该是1个字节
char x = '编'; //这样是合法的,输出也是2个字节
但是
String str = "编";
byte[] bytes = str.getBytes(); //为什么这里bytes要占用3个字节呢?
3个字节一共是3*8=24个bits,那么str.getBytes()这个方法是怎么回事呢?
解答:
首先,要搞清楚 code point 和 encoding 的区别。Java 是遵循 unicode 4.0 标准的,而内部的 character 以 utf-16 作为 encoding。unicode 4.0 标准包含从 U+0000-U+FFFF 的基本多语言平面和 U+10000-U+10FFFF 的扩展平面的文字,这是 code point。Java 的 char 类型是 16 bit 的,所以单个 char 只支持基本平面内的文字,而扩展平面的文字是由一对 char 来表示的。而 String.getBytes() 这个方法是按照指定的 encoding 返回字符串,一般中文系统的默认编码是 utf-8 (linux, mac) 或者 gbk/gb18030 (windows)。只要是基本平面内的文字,utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的。