Java中的char为什么占两个字节?能表示所有的字符吗?

2020-05-30  本文已影响0人  卡路fly

之所以是两个字节,是因为Java内部使用UTF-16编码,所以char为了表示BMP中的字符,所以占了两个字节。很明显,不能表示所有字符。

Unicode是一种字符集规范,而且还在不断发展之中。我们常说的UTF-8,UTF-16编码是其不同的两种实现。请注意,字符集和编码不是一回事。Unicode规范好比就是定义了每个字符对应一个数字,至于如何把这个数字存放在计算机中,那是另一回事。Unicode收录的每个字符对应一个数字,称作码点(code point),通常用“U+”后面跟着一个十六进制数表示。

其实UTF-16比UTF-8更早出现,在UTF-16之前还存在UCS-2,该编码固定使用16位编码,后来发现16位根本不够使用,IEEE曾推荐过UCS-4,即固定使用4个字节编码,但因为太过浪费空间被Unicode拒绝采纳了。此时,UTF-16就出现了。Unicode将16位的字符集做了延申,并规定每216为一个plane, 第一个plane称作 Basic Multilingual Plane(简称 BMP), 这里面的字符使用两个字节。对于超出了第一个plane的其他字符,将被收录在其他层级的plane,并使用第一层的代理(surrogate)将其表示,占用四个字节。至于怎么表示以及怎么编码解码的,请移步维基百科,有详细的解释。

JVM内部使用的是UTF-16编码。不管代码文件中char使用的是什么编码,都将被JVM转化为UTF-16而且只用两个字节,也就是说Java中的char占用两个字节,只能表示Unicode中第一层(BMP)中的字符,对于其他字符会报错:Invalid Character Constant, 而String中是可以的。


UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。

UTF-8 有以下编码规则:

如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节

————————————————
版权声明:本文为CSDN博主「harrisonlee.net」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LZCDTU/article/details/103865748

上一篇下一篇

猜你喜欢

热点阅读