layout | title | |
---|---|---|
default |
|
#编码问题
##ASCII码
- 最开始出现的编码
- 8位2进制,一个字节,共可以有256种状态
- ASCII码规定了128个字符编码,统一的第一位为0
英语一个字节就够了 但是中文就需要两个字节,常用的GB2312
但是就算使用两个字节表示一个汉字,也就是60000多的情况
##unicode unicode应运而生
范围很大,可以容纳100多万
每个字符的编码都不一样
只规定了二进制代码,并没有规定如何存储
- 无法区别是几个符号
- 如果统一规定了4个符号的话,会造成浪费
##UTF-8 这是Unicode的实现方式之一
变长的编码方式,可以使用1~4个字节表示一个符号
使用了下面的编码规则就可以区分并且分别是几个符号
- 对于单字节符号,字节第一位为0,后7位为unicode码,因而对于英文字母,UTF-8与ASCII相同
- 对于n字节,第一个字节的前n位都是1,第n+1为0,后面字节的前两位一律为10,剩下的没有提及的位,则为这个符号的unicode码。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
例如严字
unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是"11100100 10111000 10100101",转换成十六进制就是E4B8A5。
todo:配合正则那里的再看一下
参考自阮一峰的编码规则