计算机世界,都是二进制组成。最早期,美国出了ascii码标准,只需要1个字节,最多表示128个字符,支持了英语的字符集。全世界这么多国家,这么多种语言,肯定不够。欧洲出了iso编码标准,咱们中国出了gbk,支持中文。
编码混乱,自然就要做统一编码标准。所以诞生了Unicode编码,它目标是给全世界所有符号都编码,都有一个唯一的编码。也名万国码,单一码。它总共有三个字节,第一个字节表示平面,设计了17个平面。后两个字节,是实际数据。两个字节,最多表示65536个字符。17个平面,就是最多能表达1百多万个字符。满足全世界的字符需要了。
第一个平面,名BMP,是包含社会中常见的字符。
所以UCS-2编码,2个字节,就是代表了BMP的字符集。
然而,Unicode编码并不是一个实际在使用的编码方式。我们看到的,是utf-8,utf-16等。
utf和Unicode,有什么关系?都有个u,对了,u就是指Unicode。
utf ——Unicode transformation format。万国码转换格式
为啥不使用Unicode,原因是固定三个字节。而utf-8,utf-16,都是属于可变长编码,可兼容ascii码。
英语目前还是国际流行语言,大多数符号,只需要一个字节就能表示了,Unicode固定3个字节,就有相当大的浪费。对于BMP字符集,utf-8采用3字节表示汉字,utf-16会采用两个字节。
好了,至此,用了这么久的java。我们都知道,char是两个字节的。那char如何存储中文,或者更多字节的字符。
java会区别外码和内码。
外码,是指源代码还有class文件等,编码采用utf-8,汉字自然就是3个字节。
内码,指运行内存中的编码。也就是实际上char里面存储的字节数据。是用utf-16编码的。汉字是两个字节
对于所有的Unicode编码,utf-16,会有1-6个字节进行表示。那么jvm会使用1-3个char来组成表示。
使用byte[]转String,需要指定编码。
参考文章
Unicode介绍