UTF8编码-变长编码

时间:2022-03-04 15:53:25

我相信很多很我一样做挨踢业的人在初期都免不了遇上乱码之类的问题,相信在很多次之后都会对编码有些了解,其实编码和很多这方面的知识一样,你乍一看他挺繁琐,晦涩难懂。不过只要你理解了其中的必然性,从制定者的角度去考虑一些东西,就会发现一切都顺理成章。


首先要说明的是我们所有的信息都是以二进制字节的形式保存的,比如00000000这样的8个0就代表一个字节了。8个字节一共有256中变化,不能用来表示我们大千世界的所有文字,(想想中文就知道了)。

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

但是可能一些英语国家就吃亏了,因为他们明明用一个字节就能说清楚问题,但是因为要配合我们,却要用好四个字节,他们国家的朋友们的硬盘就白白被我们吃了。这真的很不好,人家也不能干。

所以就出了UTF8这种变长的编码,就说是有的编码是一字节的,那好,这种编码还是和他兼容,然后其它的一些就用2,3,4字节表示。


最后形成一个规律就是,一共有一到四字节四种变长的编码。

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

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

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

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

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

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

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

后面类推。


核心之处就是把0,10,110,1110,11110这五种比特的情况用在不同的位置而区分开各种编码。这在TCP/IP网络协议中也有很多类似的用法。比如几类IP地址的划分。下面这个图就是说这个:

UTF8编码-变长编码


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

可能我们仔细的看一下这个文件的内容,看一下他的编码方式,和我们上面一不一样,就知道他是不是UTF8了,不过还有一种保险一点的方法,就是在文件的最开头加上三个字节的信息,这三个字节比较少见,所以一见到他们三个开头,我们就知道是UTF8的了。

不过这不是必须的,可能我们没有这三个字节也可以。所以这中间就有一些麻烦。

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

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