对Unicode和UTF8的个人理解

发布时间 2023-03-30 13:54:30作者: 陈曦之光

最近正好在搞UTF8编码相关的知识,正好写成一篇文档,防止自己忘记,如果能启发他人,那就再好不过了。

在这里也贴一些我看过还觉得不错的博客,毕竟没有他们,我也不会懂得这么快

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html?bsh_bid=470843359

阮一峰老师的这篇博文,在我的所有搜索资料中,在启发性上面绝对算的上第一,有不懂得可以先看看这篇博客。

 

 

首先明确一个概念。

Unicode字符集

他是一个字符集,不是什么编码,也不要和UTF-8,UTF-16,UTF-32搞混了。

那么,什么叫字符集呢?

字符集就是字符、符号的集合,在它包含的符号范围里,只要存在这个符号,那就一定有他的唯一标识。

比方说字符“S”,它的编号是83号(第一位为0号),十六进制为0x53

再比方说“我”,他的编号是25105号,十六进制表示为0x6211

注意:这些数字全是字符‘S’在Unicode字符集中的唯一标识,没有经过任何编码。

 

在这个共识下,我们再谈下一步

UTF8是什么?

UTF8是对Unicode编码的一种实现,抛开编码上的限制,他和UTF16、UTF32本质上做的事情是一样的。

UTF8的一大特点就是可变长编码,一个字符在经过编码后的数据长度范围可以是1~4个字节。

 

那么,UTF8是对什么东西编码呢?

结合上面的概念,没错!

UTF8编码的对象是“任意字符在Unicode字符集中的编号”。

还是举个例子:比如中文字符“我”

Unicode编号(16进制):0x6211

Unicode编号(2进制):  01100010  00010001

经过UTF8编码后(具体编码规则我就不写了)

UTF8编码结果(16进制):0xE6,0x88,0x91

上面这个三字节的数据就是“我”字经过UTF8编码后的输出

而这个数据经过UTF8解码后得到的结果就是“我”在Unicode字符集中的编号。

 

其实到这里,Unicode和UTF8的本质已经讲完了

没有复综错杂的概念混淆

如果还没有搞清楚,可以看看我在上面贴出来的网址