多字符集和编码格式

对于391个中文字符,用UTF-8编码需要1173bytes,使用UTF-16需要782bytes。

  • UTF-16 (固定2字节表示字符,windows默认的Unicode,不兼容ASCII编码)
    由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16bits(两个字节)来表示一个字符,共可以表示65536个字符, 标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。

  • UTF-8(英文编码较短,兼容ASCII编码)
    后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。毕竟互联网70%以上的信息仍然是英文。如果连英文都用2个字节存取(UCS-2),空间浪费不就太多了?所谓UTF-8就是这样一个为了提高英文存取效率的字符集转换格式:UnicodeTransformation Form 8-bit form。用UTF-8,UNICODE的2字节字符用变长个(1-3个字节)表示:

对英文,仍然和ASCII一样用1个字节表示,这个字节的值小于128(/x80);
对其他语言的用一个值位于128-256之间的字节开始,再加后面紧跟的2个字节表示,一个字符一共是3个字节;

当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节

Charset/encoding,如下表:
EF BB BF UTF-8
FE FFUTF-16/UCS-2, little endian
FF FEUTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.

如果只是论一个汉字占用的字节数,那么 UTF-8 占用3个字节, UTF-16 占用2个字节。但是如果存储文本的话,需要在文本使用 EF BB BF 三个字节表示使用 UTF-8 编码,使用 FE FF 表示使用 UTF-16 编码。

UTF-16 固定表示两个字节表示一个字符,不管是字母还是汉字; UTF-8 使用 1- 3 个字节表示一个字符

0xxxxxxx 一个字节兼容ASCII,能表示127个字符
110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个字符
1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个字符 

所以,UTF-8的空间是根据保存的内容不同而不同。
1. 如果保存的汉字多,使用 UTF-16 占用字符数双倍的空间,使用 UTF-8 占用字符数三倍的空间;
2. 如果保存的英文字母多,使用 UTF-16 使用字符数双倍的空间,使用 UTF-8 使用字符数相同的空间。
3. 故,中文中UTF-16,英文用UTF-8,比较节约空间

你可能感兴趣的:(多字符集和编码格式)