Unicode (中文称:万国码)给每个字元提供了一个唯一的数位,不论是什么平台、不论是什么程式、不论是什么语言。
简而之,Unicode是字符集,将所有的文字,符号等等编码。
UTF-8 是编码的方式,优化 Unicode 的编码。
例如: “Hi! 你好”
你看到的 Unicode 字符编码是这样的:
H 0048
I 0069
你 4F60
好 597D
每一个字符对应了一个16进制的数字。
由于电脑只懂2进制编码,所以按照 Unicode 的方式(UCS-2),会按以下储存:
H 00000000 01001000
i 00000000 01101001
! 00000000 00100001
你 01001111 01100000
好 01011001 01111101
这个字符串共估了8个字节,对比以上中英文2进制编码,英文前9个都是0,占用了硬碟容量,十分浪费!
怎样优化?
UTF-8 的诞生就是为了优化这个问题。
- 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
- n个字节的字符 n>1,第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。如以下所示:
UCS-2: 00000000 00000000 00000000 011111112
UTF-8: 0XXXXXXX
-----
UCS-2: 00000000 00000000 00000111 111111112
UTF-8: 110XXXXX 10XXXXXX
------
UCS-2: 00000000 00000000 11111111 111111112
UTF-8: 1110XXXX 10XXXXXX 10XXXXXX
------
UCS-2: 00000000 00011111 11111111 111111112
UTF-8: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
所以 “Hi! 你好” 就变成了
H 01001000
I 01101001
! 00100001
你 11100100 10111101 10100000
好 11100101 10100101 10111101
对比 UCS-2 及 UTF-8,英文的字节变短了,虽然每个中文字符用多了一个字节。但整体来说 UTF-8 只用了9个字节,比 UCS-2 的10个字节小了一点。
整体来说,UTF-8 更节省了字节的占用容量,至小在英文字符上的确较为节省。