想要弄懂char类型,就必须了解Unicode编码机制。Unicode打破了传统字符编码机制的限制。
Unicode由来历史:
在Unicode出现之前,已有多种不同的标准,美国的ASCII(美国信息交换标准代码)、西欧语言中的ISO 8859-1、俄罗斯的KOI-8、中国的GB 18030和BIG-5等。这就产生了两个问题:一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是采用大字符集的语言其编码长度有可能不同。例如单字节编码的字符和多字节编码的字符。而设计Unicode编码的目的就是要解决这些问题,在20世纪80年代开始启动设计工作时,人们认为两个字节的代码宽度足以对世界上所有语言的所有字符进行编码,并有足够的空间留给未来扩展。91年发布了Unicode 1.0版本,当时仅占用65536个代码值中不到一半的部分。在设计Java时决定采用16位的Unicode字符集,会比使用8位字符集的程序设计语言有很大进步。遗憾的是,一段时间以后,不可避免的事情发生了,Unicode字符超过65536个,主要原因是增加了大量的汉语、日语和韩语中的表意文字,现在,16位的char类型已经不能满足描述所有Unicode字符的需要了。
Java解决此问题的基本办法:
从Java SE 5.0开始。码点是指与一个编码表中的某个字符对应的代码值。在Unicode标准中码点采用十六进制书写,并加上前缀U+.Unicode的码点分为17个代码级别,第一个代码级别称之为基本的多语言级别,码点从U+0000到U+FFFF,其中包括经典的Unicode代码;其余的16个级别码点从U+10000到U+10FFFF,其中包括一些辅助字符。
UTF-16编码采用不同长度的编码表示所有Unicode码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元;而辅助字符采用一对连续的代码单元进行编码,这样构成的编码值落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域。这样就可以迅速的知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。
在Java中char类型描述了UTF-16编码中的一个代码单元。
强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元,最好将字符串作为抽象数据类型处理。
读书使人进步-Java基础知识数据类型之Unicode和char类型
最新推荐文章于 2020-11-28 23:02:29 发布