SEO只是外表
技术才是我的追求

Unicode和UTF-8之间的区别

有了Unicode为什么还需要UTF-8

Unicode已经将全世界的字符统一在一个规则下,只要大家都用Unicode,沟通是完全没有问题了,为什么还需要UTF-8呢?这是由于Unicode并不完美造成的,Unicode存在两个问题:

1、电脑并不能区分Unicode和ASCII

我们知道Unicode字符占两个字节,ASCII字符占一个字节,当有两个字节输入到电脑里面,电脑并不能判断这两个字节是代表1个字符(Unicode),还是代表2个字符(ASCII)。

2、会造成储存空间的浪费

我们知道英文字母只用一个字节表示就够表示,现在非要用上Unicode的两个字节,文件的大小会因此大出两倍,这就会造成空间得极大浪费。

UTF-8的出现就是为了解决这两个问题。

UTF-8概念

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码(定长码)。

一般的按照UTF-8编码:

英文字符 》 一个字节

欧洲字符 》 两个字节

亚洲字符 》 三个字节

中文字符按照UTF-8编码是三个字节。

UTF-8编码规则:

1.一个字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

2.n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符Unicode码,高位用0补足。

这样就形成了如下的UTF-8标记位:

 0xxxxxxx
 110xxxxx 10xxxxxx
 1110xxxx 10xxxxxx 10xxxxxx
 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

其中:1110xxxx 10xxxxxx 10xxxxxx 就是3个字节中文字符的UTF-8编码。

不太明白需要举个栗子?放心下面有的。

Unicode和UTF-8之间的区别

Unicode是字符集,而没有编码方式,一种对字符集数字化。

UTF-8是对Unicode字符集的一种编码方式,为更好的存储和传输。

其中:

字符集:为每一个「字符」分配一个唯一的ID(学名为码位 / 码点 / Code Point)

编码方式:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)

单纯的概念解析还是有点生涩难懂,还是举个例子(例子参考知乎网友回答):

It's 棋哥博客

按照二进制Unicode字符集方式储存到电脑上是这样的:

 I  00000000 01001001
 t  00000000 01110100
 '  00000000 00100111
 s  00000000 01110011
    00000000 00100000
 棋 01101000 11001011
 哥 01010100 11100101
 博 01010011 01011010
 客 01011011 10100010

那么按照上面的UTF-8编码规则就会变成这样的:

 I  01001001
 t  01110100
 '  00100111
 s  01110011
    00100000
 棋 11100110 10100011 10001011
 哥 11100101 10010011 10001110
 博 11100101 10001101 10011010
 客 11100101 10101110 10100010

以”“字为例看看utf-8编码的过程:

01101000 11001011 -> 0110 100011 001011

1110 0110  10 100011  10 001011 -> 11100110 10100011 10001011

从这个例子我们可以看到英文字符还是一个字节,与ASCII码是一样的,这样即节省了空间又可以为只支持ASCII编码的历史遗留软件在UTF-8编码下继续工作。电脑也能根据UTF-8编码规则判断字符的长度(如电脑接收到1110开头字节,如果后面两个字节都是10开头就可以判断这连续的3个字节是表示一个字符,如果不是,就可以判断这个1110开头的字节只表示一个字符),这样UTF-8编码就解决上面提到Unicode不完美产生的两个问题了。

本文是对知乎中问题:Unicode 和 UTF-8 有何区别?自己的理解和总结。

未经允许不得转载:棋哥SEO博客 » Unicode和UTF-8之间的区别

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址