字符串编码-Unicode
作为程序员难免会与字符串打交道,而字符串的编码方式接触得最多的就是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个字节表示,因此很少会在数据库中使用,太费空间了。