Skip to content

Latest commit

 

History

History
61 lines (36 loc) · 1.98 KB

编码问题.md

File metadata and controls

61 lines (36 loc) · 1.98 KB
layout title
default
{"site.name"=>nil}

#编码问题

##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:配合正则那里的再看一下

参考自阮一峰的编码规则