字符集
首先,我们要明确2个概念,字符集和字符编码。
字符集:ASCII、GB2312、GBK、Unicode
字符编码:UTF-8、UTF-16、UTF-32
由于ASCII、GB2312、GBK不需要转化,字符编码就是自己
字符集 | 字符编码 | 字节 | 字符个数 |
---|---|---|---|
ASCII | ASCII | 1(00到7F) | 127 |
GB2312 | 兼容ASCII | 2(0xA1A1-0x7E7E) | 6763个汉字以及682个特殊符号 |
GBK | 兼容GB2312 | 2(8140-FEFE) | 汉字和图形符号21886个 |
Unicode | UTF-8、UTF-16、UTF-32 | 2(0000到FFFF) | 65535 |
Unicode32 | UTF-8、UTF-16、UTF-32 | 4(00000000到FFFFFFFF) | 理论上42亿,接近无限,满足所有字符需求 |
相比于其他特地字符集,Unicode是大一统,初衷是涵盖世界上所有的字符集。
字符编码
UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
相比于Unicode固定字符的编码,UTF-8可以动态调整编码字节数,例如’a’在Unicode是2个字节,而UTF-8编码后是1个字节,在网络传输方面非常有优势。
当需要在内存中读取文件的时候,此时将utf-8编码的内存转换为unicode编码,在内存中进行统一处理;当需要保存文件的时候,出于空间和传输效率的考虑,此时将unicode编码转换为utf-8编码