字符集与编码系列:Unicode字符集

基本概念

1.字符集:要想在计算机中显示文字,必须把文字都收集起来放在一个表中,这个表叫字符集(Charset)。

2.码表:字符集中的每个文字,都分配一个数字号码,这叫码表(Code chart)。比如中文 ‘霸’字,在码表中对应的码是38712(十进制),或者9738(十六进制)。

3.编码方式:有了码表,就需要确定哪些文字用几个字节表示,以及如果有多个字节代表一个字,字节的读取顺序,这些就是字符编码方式(Encoding)。

虽然为了严谨起见,上面我把字符集和码表分开说明,但实际上很多字符集也给每个字符分配了一个码(Code Point),所以很多人经常也把字符集叫做码表、码表叫做字符集。

Unicode

目前国际通用的字符集叫Unicode(又叫万国码、统一码),全世界所有民族地区的文字基本都包含在里面。它的出现是为了解决世界各地用不同的一套字符集,然后计算机软件无法兼容共用的问题,造福了软件开发者,也方便了用户。下图就是Unicode字符集中汉字(CJK)码表的样子,每个汉字都有个号码,比如4E00就是一的号码。

Java语言默认就使用Unicode字符集。

Unicode字符集把全世界主要文字都包括进来,刚开始每个字符用2个字节来表示,值范围0x0000~0xFFFF,共可以表示65536个字符。

后来2个字节发现不够用,比如生僻字、网络流行的电子表情符号emoji等,因此Unicode字符集不停地扩充,字符集越来越庞大,现在的Unicode字符集的编码空间扩充到3个字节,最大值为0x10FFFF,某些新字符需要3个字节才能表示。

 平面(Plane)和块(Block)

Unicode扩充之后,为了便于描述和统一分配,就有了一个新的概念:平面(Plane)。除了之前的FFFF两个低字节用来表示字符的码,第三个字节的值用来表示平面编号。比如Unicode码0x10FFFF中的0x10,就是平面编号,因此,现在的Unicode有0-16共17个平面,每个平面可以容纳FFFF个文字,所以:

理论上Unicode容纳的字符数量0x10FFFF = 平面数量 × 每平面容量 = 17 × 65536 = 1114112个

平面又包含了块(Block)的概念,一个块就是一个字节的空间,最多能表示256个字符。一个平面是2个字节的空间,最大FFFF,低位的FF是一个块,高位的FF用来作为块的编号。所以:

理论上一个平面字符数量 = FF个块 × 每个块FF个字符 = 256 ×256 = 65536个字符

BMP平面

Unicode最重要、最常用的平面是第一个平面,简称BMP(Basic Multilingual Plane ),编号为0,其实也就是最早的那65535个文字,其中已经包含了世界各民族的常用文字。其中,汉字(CJK)是占空间最多的,下图浅红色从34一直到9F共107个块,每个块又能表示256个字符,所以

理论上BMP平面包含汉字数量 = 107 × 256 = 27392个

 平面总体使用情况

目前0~16共17个平面的字符分配范围如下表。可以看到,平面4-13是空闲的,暂未分配任何字符。平面14~16是特殊平面和私有平面。

除了第0个平面BMP,平面1、2、3也已经扩展了不少字符。汉字除了在平面0霸榜,在平面2和3再次“包场”,这两个平面基本都是新补充进来的汉字生僻字。

 关于Unicode字符集的知识,先介绍到这里,下一篇讲Unicode和Java中的char类型。

 Unicode权威资料传送门:

        官网用户主页:Unicode官网 

        官网技术主页:Unicode Standard 

        目前最新版本是2021年9月发布的14.0版:Unicode 14.0.0

        最新版码表:Unicode 14.0 Character Code Charts

猜你喜欢

转载自blog.csdn.net/liudun_cool/article/details/120739653