字符编码:Unicode与UTF-8

字符编码问题从之前学Python的时候就开始困扰我,一直没有去理清楚Unicode和UTF-8之间是什么关系,只知道在写代码的时候要不断的decode、encode不停的转换才能避免各种奇怪的乱码。前两天在学习Go的时候又碰到了关于字符的问题,就花时间将它理清,绘制了几个图帮助理解,发现好像也并没有那么复杂
字符编码
1. Unicode与UTF-8的诞生

​ a. 简单介绍下字符编码:在计算机中所有内容都是以二进制存储,那么该如何表示字符呢?其实就是制作一个“映射表”,例如使用二进制(01000001)表示大写字母A,将不同的字母、符号分别用一个值表示。计算机在读到一串字节流的时候,去这张表中查找,再将它转换成对应的字母、符号即可。而因为英文字母加符号数量并不多,使用8个二进制位就完全足以表示,ASCII码就是这样。

​ b. 后来计算机不断的发展,除了美国,其他国家的人也希望用计算机。英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。ASCII显然无法满足其他语言的需求。于是不同国家就开始使用不同的编码方式,这样就导致不同国家的人“交流”十分困难,因为编码方式不同而经常导致乱码

​ c. 为了解决这一问题,人们将将所有的语言符号放到一个集合中,每一个符号用唯一的一个编码标识,这就是Unicode。所以,Unicode本质上是一个字符集合

​ d. Unicode存在的问题
​ (1)它只规定了每个字符的一个唯一标识-- 一个二进制代码,但是没有规定这个标识该怎么存储。比如说靠前 面的字符这个标识比较小,只需一个字节即可存储;而靠后面的这个代码较大,需要多个字节存储。若统一规定所有 的字符使用三个或四个字节存储,则会造成巨大的浪费。
​ (2) 没有规定一个编码方案。比如字节流传来三个字节,那么该如何识别?它有可能是三个字符、两个字符、 一个字符,具有多种情况,计算机该怎么识别?

​ e. UTF-8的诞生
​ (1) 上面说到,Unicode作为一个字符集,存在着资源浪费字节流识别字符两个尚未解决的问题,那么就需 要一种编码方式能够解决这样的问题。UTF-8就这样诞生了。
​ (2)UTF-8的编码规则

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

​ (3) 从UTF-8的编码规则可以看出:UTF-8是一种可变长编码,避免了资源浪费的同时也解决了字节流的识 别问题,因此,目前使用最广的就是UTF-8编码了。

​ f. 其他Unicode编码方式:常见的有UCS-2/UTF-16GB18030等,这里就不再叙述。

2. 编码与解码具体过程

​ a. 编码:将字符转成字节流,直接用图说明编码的过程

编码.png

​ b. 解码:将字节流转换成字符,下面上图:

解码.png

​ c. 不同编码之间的转换:

编码转换.png

更多文章发布在我的个人博客上,欢迎访问
www.guiguiyo.cn

你可能感兴趣的:(字符编码:Unicode与UTF-8)