有了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 有何区别?自己的理解和总结。