最近正好在搞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的本质已经讲完了
没有复综错杂的概念混淆
如果还没有搞清楚,可以看看我在上面贴出来的网址