首先要说明的是我们所有的信息都是以二进制字节的形式保存的,比如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