Unicode
是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0xFFFF,每组称为平面(Plane),而每平面拥有65536(2^16)个码位,共1114112(65536*17)个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
UTF-8
(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。
UTF-8编码规则:
如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8转换表表示如下:
Unicode/UCS-4 | bit数 | UTF-8 | byte数 | 备注 |
---|---|---|---|---|
0000 ~007F | 0~7 | 0XXX XXXX | 1 | 如果只有一个字节则其最高二进制位为0 |
0080 ~07FF | 8~11 | 110X XXXX 10XX XXXX | 2 | |
0800 ~FFFF | 12~16 | 1110 XXXX 10XX XXXX 10XX XXXX | 3 | 基本定义范围:0~FFFF |
1 0000 ~1F FFFF | 17~21 | 1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX | 4 | Unicode6.1定义范围:0~10 FFFF |
20 0000 ~3FF FFFF | 22~26 | 1111 10XX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX | 5 | |
400 0000 ~7FFF FFFF | 27~31 | 1111 110X 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX | 6 |
说明:20 0000 ~3FF FFFF和400 0000 ~7FFF FFFF对应的行非unicode编码范围,属于UCS-4 编码早期的规范UTF-8可以到达6字节序列,可以覆盖到31位元(通用字符集原来的极限)。尽管如此,2003年11月UTF-8 被 RFC 3629 重新规范,只能使用原来Unicode定义的区域, U+0000到U+10FFFF。根据规范,这些字节值将无法出现在合法 UTF-8序列中。
转换举例:
UNICODE uCA(1100 1010) 编码成UTF-8将需要2个字节:
过程如下:
uCA(1100 1010)处于0080 ~07FF之间,从上文中的转换表可知对其编码需要2bytes,即两个字节,
对应 UTF-8格式为: 110X XXXX10XX XXXX。从此格式中可以看到,对其编码还需要11位,而uCA(1100 1010)仅有8位,这时需要在其二进制数前补0凑成11位: 000 1100 1010, 依次填入110X XXXX 10XX XXXX的空位中, 即得
1100 0011 1000 1010(C3 8A)。
UNICODE uF03F (1111 0000 0011 1111) 编码成UTF-8将需要3个字节:
uF03F 处于0800~FFFF之间,从上文中的转换表可知对其编码需要3bytes,即三个字节,对应格式为:1110 XXXX 10XX XXXX 10XX XXXX,编码还需要16位,将1111 0000 0011 1111(F03F)依次填入,可得:
1110 1111 1000 0000 1011 1111(EF 80 BF)。
结果:
Unicode 16进制 | Unicode 2进制 | bit数 | UTF-8 2进制 | UTF-8 16进制 |
---|---|---|---|---|
CA | 1100 1010 | 8 | 1100 0011 1000 1010 | C3 8A |
F0 3F | 1111 0000 0011 1111 | 16 | 1110 1111 1000 0000 1011 1111 | EF 80 BF |