weiqi7777

utf-8 编码学习

0
阅读(2811)


         Unicode是一个编码的符号集,容纳了世界上的所有的符号。但是unicode只是规定了符号的二进制代码,并没有规定二进制代码应该如何存储。所以,就出现了utf-8编码。Utf-8只是规定了unicode的二进制代码,在计算机中的存储方式。

         Utf-8是可边长的编码方式,使用1-4个字节来表示一个符号。Utf-8的编码规则也很简单,根据符号的unicode编码进行变化。

         以下是unicode转化为utf-8的规则。

clip_image002

         对于utf-8第一个字节的数据最前面的1决定这个符号是由几个字节编码。如果是0,表示是一个字节编码,2,表示两个字节编码,4表示4个字节编码。后面的字节的前两位都是10。然后再将符号的unicode编码,依次填入到x中。

         以下举个例子:

         使用记事本,里面写入一些数据,保存为utf-8格式。

         clip_image003

         以上是文件中的内容,我用的是notepad++,可以使用插件hex-editor查看二进制文件

clip_image005

         以上就是文件中的内容以utf-8的格式保存的数据。

         来对数据进行分析。

         最前面的3个字节ef bb bf是固定的,表示这是一个utf-8编码格式的文件。后面才是真正的内容。

         在网上使用unicode在线转换,查看卢骏的unicode编码

         clip_image006

         得知

汉字

Unicode(十六进制)

Unicode(二进制)

5362

0101 0011 0110 0010

9a8f

1001 1010 1000 1111

         按照编码规则,先看符号的unicode属于哪个范围,从而判定需要几个字节。一比较,就知道两个汉字都属于第三个范围,需要3个字节。

         也就是utf-8格式是:

                   1110xxxx 10xxxxxx 10xxxxxx

然后将符号的unicode的二进制从低到高依次填入到格式中的x中,填入顺序也是从低到高。

所以,

汉字

Utf-8(二进制)

Uff-8(十六进制)

1110 0101 1000 1101 1010 0010

E5 8d a2

1110 1001 1010 1010 1000 1111

E9 aa 8f

         和查看的二进制文件是一样的结果。

         然后有两个回车,回车在windows下是0d 0a,这个是ASCII编码的。要转换为utf-8编码。对于ASCII127个字符,对应的utf-8编码其实和ASCII编码是一样的。所以utf-8下的回车还是0d 0a

         然后又是“卢骏这两个汉字,编码就是E5 8d a2 E9 aa 8f。然后又是一个回车,0d 0a。最后是weiqi7777。按照ASCII编码,就是77 65 69 71 69 37 37 37 37

         最后分析的结果就是以下:

clip_image008

         通过这样一个例子,就可以了解到utf-8是怎么编码的了。