字符编码笔记
其实在刚刚接触编程的时候,我就知道有Unicode和UTF-8,知识只是停留在表面,遇到的问题也是:哎呀,页面展示出现乱码啦,需要修改一下字符编码集或者为啥解析不对,一直都是一知半解(大学计算机数据结构和算法没学好 - -!),直到看了阮一峰老师的笔记,才完全理解底层逻辑。在这标明一下原作者的博客地址,此文是在阅读原作者之后,进行输出的理解和总结。
1、计算机表示字符的起源
计算机内部所有的信息都是二进制,每个二进制(bit)有0
、1
两种状态,人为规定了八个二进制为一个字节(byte)。那么一个字节就可以表示256种不同的状态,即00000000
到11111111
。
上个世纪60年代,美国先规定了一套字符编码,所谓字符编码其实就是他们母语(英语)与字节的关系,这个被称之为ASCII码,一直被沿用至今。
ASCII码:规定了128个字符的编码,比如空格SPACE
是32,大写的A
是65等等。这128个符号(包括32个不饿能答应的控制符号),最多占用一个字节的7位,前面的统一补0
。
非ASCII编码:英文128个字符就够了,但是其他语言呢?往往是不够的,这就不能通过ASCII来表示了。于是,每个国家都制定了自己编码,但是又出现一个问题,那就是很多国家没有英语这么简单(字符意义上),使用的字符很多,比如汉字多达10万多,一个字节肯定不够的,就需要多个字节来表达一个符号。
2、Unicode
上一节说到,世界存在很多编码方式。同一个二进制可能被解释成不同的符号。所以在打开文件的时候就要知道他的编码方式,如果使用错误的编码方式就会导致乱码。
所以人们发明了一种通用的编码格式,将世界上的所有符号纳入其中。每个符号都给予独一无二的编码,这样乱码的问题就会消失。这就是unicode编码。
Unicode是一个很大的集合,现在的规模能容纳100多万个符号。每股符号的编码都不一样。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
现在有一个问题就是如何区分你是Unicode还是ASII呢?计算机怎么知道三个字节是一个符号,而不是表示三个符号呢?如果我们用三个字节表示一个符号,那么就会产生浪费,那些只需要一个字节表示的字符就会被补充两个字节的0
产生了极大的浪费。
他造成的结果是:
出现了多种Unicod存储方式,也是说很多不同的二进制格式可以用来表示Unicode。
Unicode在很长一段时间无法推广。
3、UTF-8
互谅网的布局,要求一种统一的编码方式,UTF-8核心问题是制定了Unicode实现标准,解决Unicode位数无法确定,浪费空间的问题。
所以说UTF-8是Unicode的一种实现方式
刚才说了UTF-8的一大特点是,它是一种可变的编码方式。他可以使用1~4个字节表示一个符号,根据不同的符号来改变字节长度。
UTF-8的编码规则很简单,只有两条:
- 对单字节的符号,字节第一位为
0
,后7位位这个符号的Unicode码。因此对于英文来说,UTF-8和ASCII是一样的。 - 对于有
n
个字节的符号(n>1),第一个字节前n
位都是1
,前n+1
位为0
。后边的字节前两位都是10
。剩下的没有提及的二进制,全部为这个符号的Unicode码。
eg:
1 |
|