字符串编码-Unicode

发布时间 2023-07-30 15:56:58作者: mshentai

作为程序员难免会与字符串打交道,而字符串的编码方式接触得最多的就是ASCII码了,然而ASCII码每个字母对应1Byte,因此字母总量最多只有256个,这是不能满足世界上众多的文字的需求的,因此,Unicode编码的出现便是必然的。

Unicode

Unicode 为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF (十六进制),有 110 多万,每个字符都有一个唯一的 Unicode 编号,这个编号一般写成 16 进制,在前面加上 U+。例如:“马”的 Unicode 是U+9A6C。Unicode 就相当于一张表,建立了字符与编号之间的联系。

然而Unicode只是给出了一份字符与编号的映射表,没有定义如何将这份表落实到二进制表示中,要用几个字节来表示编号呢?方案主要有UTF-8,UTF-16,UTF32。

UTF-8

UTF-8是当下最为流行的编码方式,为了节省字符串容量,UTF-8使用了变长字节来表示,编号小的字符用较少的字节表示,编号较大的字符使用较多字节表示,字节数从1到4不等。

1.对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。 

2.对于n字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

     例如,1个字节:0xxxxxxx

    2个字节:110xxxxx  10xxxxxx

    3个字节:1110xxxx  10xxxxxx  10xxxxxx

    4个字节:11110xxx  10xxxxxx  10xxxxxx

UTF-16

UTF-16是Windows系统开发中常见的字符串编码方式,也是利用变长字节来表示字符。

1.编号在 U+0000 到 U+FFFF 的字符(常用字符集),用两个字节表示。 

2.编号在 U+10000 到 U+10FFFF 之间的字符,用四个字节表示。

UTF-32

UTF-32最简单,直接一刀切,所有字符都用4个字节表示,因此很少会在数据库中使用,太费空间了。