utf-8与unicode

简介: 字符编码是从ASCII开始,那时候美国为了解决的字符问题,提出了ASCII码。每个字符占用一个字节。但ASCII编码实际只用了7位,空了一位。后来等计算机传播开来,欧洲的各个国家出现了新的字符编码的问题。

字符编码是从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,那么表示高位在第一个字节则就是大端序。

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

相关文章
|
6月前
|
存储 编解码 C语言
ASCII、GBK与UTF-8的联系
ASCII、GBK与UTF-8的联系
86 1
|
存储 网络协议 安全
字符编码技术专题(一):快速理解ASCII、Unicode、GBK和UTF-8
今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。 这个问题比我想象的复杂,午饭后一直看到晚上9点,才算初步搞清楚。 下面就是我的总结,主要用来整理自己的思路。我尽量写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的*石,对于程序员来说尤其重要,字符编码的知识是必须要懂的。
102 0
|
存储 JavaScript 程序员
【字符编码详解】ASCII、GB2312、GBK、UTF-8、UTF-16编码与Unicode字符集
【字符编码详解】ASCII、GB2312、GBK、UTF-8、UTF-16编码与Unicode字符集
902 0
|
存储 自然语言处理
最基础的ASCII、Unicode、UTF-8一起来多了解点
最基础的ASCII、Unicode、UTF-8一起来多了解点
251 0
最基础的ASCII、Unicode、UTF-8一起来多了解点
|
存储 算法 Java
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
393 0
|
Web App开发 JavaScript Java
编码问题 UTF-8 & GBK
记一次奇怪的编码问题。 * Meta Element vs Response Header * Meta 的作用? * 一个细节 * 细节对编码的影响 ## Meta Element vs Response Header 一个 GBK 编码页面,使用 meta 指定页面编码和使用 response header 指定页面编码。哪个优先级比较高? ###
2401 0
|
存储 自然语言处理
字符编码unicode,utf-8和ascii
Ascii编码 由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
1106 0