结论:UNICODE是字符集,UTF-8、UTF-16、UFT-32是编码,编码是字符集的实现
先来解释一下字符集(character set)跟编码(encoding)的关系,做个类比:
字符集比作动物
{狮子、老虎、猴子}
编码就能比作表述这些动物的各种语言
中文编码 {狮子,老虎,猴子}
英文编码{lion,tiger,monkey}
日语编码{ライオン,トラ,サル}
当然还有泰文编码,西班牙编码等等......
字符集:顾名思义,是一个字符的集合,只需要关心是里面包含了那些字符。
编码:就是用计算机认识的二进制去表示这个集合里面元素的方案,可以不止有一种。
按照这种思路,我们也可以自己创造一个字符集,以及设定编码。比如我要设计一个字符集,里面只包含{口,袋,妖,怪}}4个字符。那对应的编码可以设计为:
口 | 0001 |
袋 | 0010 |
妖 | 0100 |
怪 | 1000 |
或者:
口 | 0001 |
袋 | 1000 0000 |
妖 | 1000 0100 |
怪 | 0111 |
相信大家现在明白字符集和编码的关系了。
再简单说一下UNICODE那些事。引用一下UNICODE官网对UNICODE字符集的说明:
Unicode provides a unique number for every character,
no matter what the platform,
no matter what the program,
no matter what the language.
这句话有两点地方需要注意:
- 3个 NO MATTER,这指出了UNICODE包含的字符之多
- UNICODE给每个字符分配了一个唯一的整数,这个整数的范围是0x0000~0x10FFFF。所以说UNICODE本身是编码也不是个错误的说法
UCS-2,UCS-4又是什么呢?从英文翻译可以知道,“Universal Character Set“,就是字符集,后面的数字代表每个字符的整数长度:UCS-2每个字符使用2个字节16位的整数表示,UCS-4每个字符使用4个字节32位整数表示。UCS-2是UNICODE的一个真子集,对应0x0000~0xFFFF,包含了各种语言常用的字符,熟悉WINDOWS编程API的同学都知道,宽字符其实就是UCS-2的字符,占2个字节。Windows的资料几乎把UNICODE和UCS-2说成同一样东西,说UNICODE用16位表示一个字符。
至于UTF-8、UTF-16、UFT-32这3种常见的对UNICODE的编码方式,包括定长跟不定长的方案。