字符编码笔记

这是个啥,啥?啥!

其实在刚刚接触编程的时候,我就知道有Unicode和UTF-8,知识只是停留在表面,遇到的问题也是:哎呀,页面展示出现乱码啦,需要修改一下字符编码集或者为啥解析不对,一直都是一知半解(大学计算机数据结构和算法没学好 - -!),直到看了阮一峰老师的笔记,才完全理解底层逻辑。在这标明一下原作者的博客地址,此文是在阅读原作者之后,进行输出的理解和总结。

字符编码笔记:ASCII,Unicode 和 UTF-8

1、计算机表示字符的起源

计算机内部所有的信息都是二进制,每个二进制(bit)有01两种状态,人为规定了八个二进制为一个字节(byte)。那么一个字节就可以表示256种不同的状态,即0000000011111111

上个世纪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产生了极大的浪费。

他造成的结果是:

  1. 出现了多种Unicod存储方式,也是说很多不同的二进制格式可以用来表示Unicode。

  2. Unicode在很长一段时间无法推广。

3、UTF-8

互谅网的布局,要求一种统一的编码方式,UTF-8核心问题是制定了Unicode实现标准,解决Unicode位数无法确定,浪费空间的问题。

所以说UTF-8是Unicode的一种实现方式

刚才说了UTF-8的一大特点是,它是一种可变的编码方式。他可以使用1~4个字节表示一个符号,根据不同的符号来改变字节长度。

UTF-8的编码规则很简单,只有两条:

  1. 对单字节的符号,字节第一位为0,后7位位这个符号的Unicode码。因此对于英文来说,UTF-8和ASCII是一样的。
  2. 对于有n个字节的符号(n>1),第一个字节前n位都是1,前n+1位为0。后边的字节前两位都是10。剩下的没有提及的二进制,全部为这个符号的Unicode码。

​ eg:

1
2
3
4
5
6
7
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

字符编码笔记
https://liu620.github.io/2024/02/03/字符编码笔记/
作者
alen
发布于
2024年2月3日
许可协议