utf-8与unicode

字符编码是从ASCII开始,那时候美国为了解决的字符问题,提出了ASCII码。每个字符占用一个字节。但ASCII编码实际只用了7位,空了一位。后来等计算机传播开来,欧洲的各个国家出现了新的字符编码的问题。如法国,出现了很多在英文字符上面加标记的字符,所有实际字符超过128种,但正好,一个字节总共8位,原来ASCII原来不用的那一位就派上用场了。但是这使得欧洲的各个国家之间的字符编码有冲突,也就是说前128位没有问题,但是后面的128位在不同的国家表示的字符就不一样,使得各国之间信息交换有障碍。而这个障碍在计算机引入亚洲乃至全世界的时候变得越来越严重,阻碍了国际间的信息交流。那么如何解决呢?

其实也很简单,只要字符编码的位数提升到能够容纳世界上所有的字符就可以了。unicode码应运而生。但是要知道每个字符要占4个字节。这对于美国和欧洲国家是难以接受的。因为美国等国家用到的字符只需要一个字节就可以表示了。而unicode码却要让这些国家浪费3/4的资源。这是让美国等国家难以接受的!

所以unicode码的utf-8表示形式很好的解决了这个问题。当然还有utf-16,utf-32这里就不讨论了。

 

utf-8是这样编码的,总共两种情况。假设该字符的utf-8编码占n个字节。

1:如果n=1,则字节的第一位为0,后面的就是填充其unicode编码。

2:如果n>1,则将第一个字节的前n位置为1,将n+1位置为0。然后后面的每个字节的前两位为10。其他位填充其unicode编码。

 

由上面的定义可以看出utf-8使用的还是unicode编码,只是是一种变体,将unicode编码中的无效位去除了。所以utf-8是unicode编码的一种。

 

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

上面显示的unicode字符范围与utf-8编码对应的形式。

 

按照这种规则,我们来实际看看一个字符的utf-8编码是如何生成的?

“严”的unicode是4E25(100111000100101),可以看到其unicode符号范围属于0000 0800-0000 FFFF,那么我们应该采取第三种形式1110xxxx 10xxxxxx 10xxxxxx,然后将100111000100101填充到x的地方,就得到了“严”的utf-8编码如下:

11101001 10111000 10100101。

 

windows的notepad本身就提供四种编码方式:

1:ASCII

2:unicode

3:unicode-big endian//表示大端序

4:utf-8

 

需要注意的是:unicode编码的文件都以两个字符表示端序,FEFF表示大端序,以FFFE表示小端序。如何理解呢?

例如“严”的unicode是4E25,如果其存储形式也是4E25,那么表示高位在第一个字节则就是大端序。

我们因特尔处理器多采用的小端序。

上一篇:非MFC规则DLL用法总结


下一篇:MDI的多种文档类型