关于编码问题,内容太多,隔一段时间就会遗忘!
因此本文不涉及很具体的编码知识,主要进行归纳,以便从概念上进行区间:
(请不要对时间顺序深究)
1、混战时代
ANSI(美国国家标准学会),规定1字节的 0~127 区间,只能我用, 超出部分 0x80~0xFFFF,你们自己看着办。于是各国各式各样的编码来了!
遵照ANSI规定:
1、美国:ASCII码(美国信息交换标准编码), 1字节 , 0~127表示字符和控制码, 128~255, 没有规范
2、中国大陆:
GB2312(国标, 简体中文),英文1个字节, 汉字2个字节,共计约7000多字符。
不够呀,繁体、古文咋弄?以 GB2312为基础进充,有了GBK(国标扩展)简繁二合一,包括20000多字符。
还不够,少数民族 呢?再扩充,GB18030诞生,7万多字符,2字节已经不够用了,要4字节;
3、中国台湾:Big5(繁体中文)。
4、欧洲: ISO-Latin-1, ISO-Latin-9
5、日本:Shift_JIS
6、韩国:Euc-kr
... ...
你有我有,全都有了,结果世界乱套了!同一个号码,在不同的国家代表完全不一样的意思!
(可以看出,遵照ANSI规定,各国的ANSI编码是不同的!我国是GBxxx)
2、一统时代(貌似)
UNICODE字符集,对世界上绝大部分的文字的进行整理和统一规定,字符分为17面,每平面拥有65536个码位,共计百万个,用的最多的是0面。字符集有了,但是如何存储、传输、编码没规定,乱象再生!各种编码格式来了!
按照UNICODE规定:
1、UCS-2: 定长编码,2字节(16bit)为一个单位,每2个字节表示一个字符,最大表示65536个!不兼容ASCII,程 序处理简单,但英文存储浪费,而且还不够用!
2、UTF-8 :变长编码,1字节(8bit)为一个单位,每1个或者多个字节表示一个字符, 英文存储也节省了,还可以无限 扩展,于是在互联网传输中广泛使用,程序处理就稍微复杂一些了!
3、 UTF-16:变长编码,2字节(16bit) 为一个单位,每2个字节或者4个表示一个字符。兼容UCS-2,还可以表示足够多的 字 符。因为大多文字都可以用两个字节编码,相比Utf-8处理要简单些!
4、UCS-4 / UTF-32:定长编码,4字节(32bit)为一个单位,每4字节表示一个字符。够大,程序处理简单,浪费严重!
关于字节存储顺序BOM(Byte Order Mark):
对于UCS-2,UTF-16,UTF-32,如果带BOM,以0xFFEF(小端)和0xEFFF(大端)开头为标志。
UTF-8(BOM) :3字节:EE BB EF 开头