最近学习python学到了unicode的编码问题,下面还有一些小的疑惑:
①:我们都知道utf-8是一种可变长度的读字符串,有如下的描述:
•
思想:不要用固定长度的
32-bit integer
(
4 byte
)。对常用的字符,给其一个小的编号(1byte),以节省空间;对不常用的字符,给其一个大编号
那么问题就是,如何的识别这样的可变的长度呢?
当这些高字节位为0时,低字节就是ASCII字符,而若高位是1时,就会知道这是一个大于1位的数(高位是第八位)。
UTF-8编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8转换表表示如下:
Unicode/UCS-4
|
bit数
|
UTF-8
|
byte数
|
备注
|
0000 ~
007F
|
0~7
|
0XXX XXXX
|
1
| |
0080 ~
07FF
|
8~11
|
110X XXXX
10XX XXXX
|
2
| |
0800 ~
FFFF
|
12~16
|
1110XXXX
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
|
说明:此非unicode编码范围,属于UCS-4 编码
早期的规范UTF-8可以到达6字节序列,可以覆盖到31位元(通用字符集原来的极限)。尽管如此,2003年11月UTF-8 被 RFC 3629 重新规范,只能使用原来Unicode定义的区域, U+0000到U+10FFFF。根据规范,这些字节值将无法出现在合法 UTF-8序列中
|
400 0000 ~
7FFF FFFF
|
27~31
|
1111 110X
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
|