UTF-8和Unicode的关系:
看完上面两个概念解释,那么解释UTF-8和Unicode的关系就比较简单了 。Unicode就是上文中提到的编码字符集,而UTF-8就是字符 编码,即Unicode规则字库的一种实现形式 。随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现 。它几乎涵盖了 各个国家语言可能出现的符号和文字,并将为他们编号 。详见:Unicode on Wikipedia 。
Unicode的编号从0000开始一直到10FFFF共分为16个Plane,每个Plane中有65536个字符 。而UTF-8则只实现了第一 个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库,这也造成了它在某些场景下对于特殊字符 的处理困难(下文会有提到) 。
UTF-8编码简介:
为了更好的理解后面的实际应用,我们这里简单的介绍下UTF-8的编码实现方法 。即UTF-8的物理存储和Unicode序号的转换关系 。
UTF-8编码为变长编码 。最小编码单位(code unit)为一个字节 。一个字节的前1-3个bit为描述性部分,后面为实际序号部分 。
如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间 。0之后的所有部分(7个bit)代表在Unicode中的序号 。
如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间 。110之后的所有部分(7个bit)代表在Unicode中的序号 。且第二个字节以10开头
如果一个字节以1110开头,那么代表当前字符为三字节字符,占用2个字节的空间 。110之后的所有部分(7个bit)代表在Unicode中的序号 。且第二、第三个字节以10开头
如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节 。10之后的所有部分(6个bit)代表在Unicode中的序号 。
具体每个字节的特征可见下表,其中x代表序号部分,把各个字节中的所有x部分拼接在一起就组成了在Unicode字库中的序号:
文章插图
我们分别看三个从一个字节到三个字节的UTF-8编码例子:
文章插图
细心的读者不难从以上的简单介绍中得出以下规律:
3个字节的UTF-8十六进制编码一定是以E开头的 。
2个字节的UTF-8十六进制编码一定是以C或D开头的 。
1个字节的UTF-8十六进制编码一定是以比8小的数字开头的 。
为什么会出现乱码?
先科普下乱码的英文native说法是mojibake 。
简单的说乱码的出现是因为:编码和解码时用了不同或者不兼容的字符集 。对应到真实生活中,就好比是一个英国人为了表示祝福在纸上写了bless(编 码过程) 。而一个法国人拿到了这张纸,由于在法语中bless表示受伤的意思,所以认为他想表达的是受伤(解码过程) 。这个就是一个现实生活中的乱码情 况 。在计算机科学中一样,一个用UTF-8编码后的字符,用GBK去解码 。由于两个字符集的字库表不一样,同一个汉字在两个字符表的位置也不同,最终就会 出现乱码 。
我们来看一个例子:假设我们用UTF-8编码存储很屌两个字,会有如下转换:
文章插图
于是我们得到了E5BE88E5B18C这么一串数值 。而显示时我们用GBK解码进行展示,通过查表我们获得以下信息:
文章插图
解码后我们就得到了寰埚睂这么一个错误的结果,更要命的是连字符个数都变了 。
如何识别乱码的本来想要表达的文字?
推荐阅读
- 阴阳师尘世之梦玩法介绍 阴阳师彼世之花尘世之梦玩法规则
- sin0是多少
- 阴阳师花合战返场皮肤怎么买 阴阳师花合战客岁花札机制介绍
- pcie4.0和pcie3.0区别详细介绍
- 阴阳师夜行荒河怎么玩 阴阳师夜行荒河玩法奖励介绍
- 脑洞大师115关怎么过
- 巧用自定义形状制作个性梦幻签名
- 阴阳师彼世之花活动介绍 阴阳师彼世之花商店奖励一览
- 阴阳师迷蝶寻迹怎么玩 阴阳师迷蝶寻迹活动玩法介绍