字符集charset : 定义一个集合中包含多少字符, 即哪些字符属于该字符集哪些不属于, 比如: ASCII, GBK, Unicode, 几乎所有其他字符集都包含ASCII字符集
编码encoding : 定义字符如何用字节存储, 比如: ASCII(也表示编码),GBK(也表示编码), Unicode(也表示编码), UTF8, UTF16
一个字符集有一种或者n种编码, 1:n
有时一个名字既代表一个字符集又代表一种编码, 比如: GBK, ASCII, Unicode
Unicode字符集常用2种编码方式: Unicode编码, UTF8编码. 其中Unicode编码定义每个字符占2个字节, 很多系统内存中都使用Unicode编码, 比如: C#, Java, 比如: 在C#中, new char[10]分配10x2=20个字节的空间用于存储10个Unicode编码的字符.
而UTF8定义英文字符1个字节, 中文等字符则占3个字节, 这样在存储和网络传输上英文字符串时占用的空间和带宽就较小.
字符串"a中"(2个字符)保存成文件时如下:
编码 | 字节 | 说明 |
GBK | 61 D6 D0 | 61是GBK编码的''a', D6 D0是GBK编码的'中' |
Unicode | FF FE 61 00 2D 4E | FF FE是Unicode编码的文件首标识, 61 00是Unicode编码的'a', 2D 4E是Unicode编码的'中' |
UTF8 | EF BB BF 61 E4 B8 AD | EF BB BF是UTF8的文件首标识, 61是UTF8编码的'a', E4 B8 AD是UTF8编码的'中' |