UTF8变长编码

首先要说明的是我们所有的信息都是以二进制字节的形式保存的,比如00000000这样的8个0就代表一个字节了。

1个字节一共有256中变化,不能用来表示我们大千世界的所有文字,(想想中文就知道了)。

所以为了能有一种编码表示所有语言的文字,那我们就得加长位数,比如全世界有256*256*256*256个不同的文字,那么我们就得用4个字节的二进制来表示。

说英语的国家就吃亏了,因为他们明明用一个字节就能表示一个字母,却因为要配合我们,要用好四个字节表示一个字母,保存字母的硬盘会白白浪费了大量了空间。

怎么解决这个问题?

UTF8变长编码可以解决。有的文字是1个字节存储的,有的文字是2个字节存储的,还有3个字节存储的,还有4个字节存储的。

最后集合起来就是一共有一到四字节四种变长的编码。

一字节:0*******

两字节:110*****,10******

三字节:1110****,10******,10******

四字节:11110***,10******,10******,10******

就是这四种情况。相信你已经知道我们怎么来判断一个字是几字节的了。

如果是以0开头的,那么他就是一个1字节编码,取到它一字节的数据去一字节表中找就OK了。

如果是以110开头的,那么它就是一个2字节编码,取到它两字节的数据去两字节表中找就OK了,而且它的第二个字节一定要是10开头,不然就是乱码了。

后面类推。

核心之处就是:

把0,110,1110,11110这4种比特用在不同的位置而区分开不同长度的编码.

把10这个比特用来连接多字节字符之间的多个字节。

还有一点要说明,就是一个UTF8格式的文件,它要表明它的身份,以让人用UTF8的读法来读它。

可能我们仔细的看一下这个文件的内容,看一下字节出现个格式,和我们上面所说的是否一样,也就知道它是不是UTF8编码了。

不过还有一种保险一点的方法,就是在文件的最开头加上三个字节的信息,这三个字节比较少见,所以一见到它们三个开头,我们就知道是UTF8格式的文件了,使用这种方式可以让我们快速判断出来文件是不是UTF8格式的,有助于提高性能,不过这不是必须的,我们没有这三个字节也可以判断文件的格式是不是UTF8编码方式。

比如UltraEdit这个强大的工具,我们可以用它查看16进制,你可以试试建立一个文本,然后用16进制模式打开,记一下它开头的几个字节,然后保存为UTF8,再看一下前几个字节,就会发现多了三个字节。这就是刚才说的头,它的学名叫BOM。

这三个字节分别是:EF BB BF

原文发布于微信公众号 - 明丰随笔(liumingfengwx2)

原文发表时间:2019-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券