字符集
字符集,也称作字符编码方案,是为字符集合中每一个字符分配一个唯一ID的编码字符集.包括了Unicode,ASCII,ANSI等字符集。
Unicode字符集 — 所有字符组成的字符集
国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。如果全世界每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
ASCII字符集 — 西文字符集
美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用8位表示256种可能的字符,包含所有的大小写字母,数字0~9,标点符号与特殊控制符号。
ANSI字符集 — 西文字符+不同语言文字的字符集
为使计算机支持更多语言,使用1 个字节来表示 1 个英文字符(标准的ASCII字符集)。超出此范围的语言文字使用0x80~0xFFFF来编码,即扩展的ASCII编码。不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码方案/标准。
例如:
GBK、GB2312 — 简体字符集
Big5 — 繁体字符集
GB18030 — 汉字、日文假名、朝鲜语和中国少数民族文字大字符集
Shift_JIS — 日语字符集
字符编码
字符编码是字符集的编码实现或者编码规则,每个已经编好码的字符对应到字符集的一个独立的位置上.
分为定长编码和可变长编码(节约编码).
编码形式有单字节编码,双字节编码,混合字节编码等.(1byte=8bit)
例如:
字符A用ASCII单字节定长编码是0100 0001,
但是汉字数量超出了ASCII编码范围(最多28=256个字符),
所以用Unicode编码(最多216=65536个字符),表示原本无法表示的汉字,
例如字符’知’用Unicode双字节定长编码是0111 0111 1110 0101,字符A表示为0000 0000 0100 0001
但是,原本可以用一个字节存储的英文字母,现在变成两个字节,如果文档的英文字母很多的话就产生了浪费.
所以产生了避免浪费的可变长混合编码方式:UTF-8,规则是:英文字母编码为1个字节,汉字字符则是3个字节(详细请参考相关文档)
常见字符编码
基于Unicode字符集的字符编码:Unicode,UTF-8,UTF-16,UTF-32
基于ASCII字符集的字符编码:ASCII
基于ANSI字符集的字符编码:GB2312、GBK、GB18030、Big5、Shift_JIS
容易混淆的概念
Q: 为什么Unicode在概念上既是字符集又是字符编码?
A: 实际上Unicode=Unicode字符集+Unicode(定长编码)+UTF-8,UTF-16等字符编码的总称
Unicode编码是Unicode字符集的完整实现,即用两个字节表示字符集中的一个独立字符,而UTF-8是Unicode字符集的可变长编码的实现. 所以Unicode,ANSI,ASCII都是广义表示,必须加上字符集或者编码规则来区分概念.
Q: 可以用实例说明一下Unicode编码和UTF-8编码的区别吗?
A: 假如记事本输入中包含以下信息:
保存时,选择保存为Unicode和UTF-8两个文本
查看文件大小,就可以发现Unicode编码的大小比UTF-8编码大了13字节,这是因为
Unicode: 10x2(数字)+7x2(字母)+3x2(汉字)+1x2(不可见的回车符)=42字节
UTF-8: 10x1(数字)+7x1(字母)+3x3(汉字)+1x3(不可见的回车符)=29字节