从编码的历史了解编码
话说计算机是由美国佬搞出来的嘛,他们觉得一个字节(可以表示256个编码)表示英语世界里所有的字母、数字和常用特殊符号已经绰绰有余了(其实ASCII只用了前127个编码)。后来欧洲人不干了,法国人说:我需要在小写字母加上变音符号(如:é),德国人说:我也要加几个字母(Ä ä、Ö ö、Ü ü、ß)。于是,欧洲人就将ASCII没用完的编码(128-255)为自己特有的符号编码(后来称之为“扩展字符集”)。等到我们中国人开始使用计算机的时候,尼玛,256个编码哪够?我泱泱大中华,汉字起码也得N多万吧,就连小学生都得要求掌握两三千字。国标局最后拍板:一个字节不够,那我们就用多个字节来为汉字编码吧,但是,国情那么穷,字节那么贵,三个字节伤不起,那就用俩字节吧,先给常用的几千汉字编个码,等以后国家强盛了人民富裕了,咱再扩展呗---于是GB2312就产生了。台湾同胞一看,尼玛,全是简体字,还让不让我们写繁体字的活了,于是台湾同胞也自己弄了个繁体字编码---大五码(Big-5)。同时,其它国家也在为自己的文字编码。最后,微软苦逼了:顾客就是上帝啊,你们的编码我都得满足啊,这样吧,卖给美国国内的系统默认就用ASCII编码吧,卖给中国人的系统默认就用GBK编码吧,卖给韩国人的系统默认就用EUC-KR编码,...但是为了避免你们误会我卖给你们的系统功能有差异,我就统一把你们的默认编码都显示成ANSI吧。---本故事纯属虚构,但“ANSI编码”确实只存在于Windows系统。
——转自 ANSI是什么编码?
1). ASCII码
美国最先统一规定英语字符与二进制位之间的对应关系:
使用一个字节的后7位来表示128个字符,第1位统一规定为0;
例如,字母A的ASCII码为(01000001)
2). GBK/GB2312/Big-5、EUC-KR、Shift JIS等
法德俄等国在ASCII码的基础上将128~255这一段用来表示各自语言中的字符,像中文一个字节根本不够用就扩展到了2个字节
3) Unicode
Unicode是为了试图将世界上所有的符号都纳入,每个符号都有唯一对应的二进制代码;
但Unicode没有具体规定如何存储(比如使用几个字节,这些字节中没有被使用的位使用什么来填充)
4. UTF-8
UTF-8是Unicode的一种实现方式,变长方式编码(可以用1~4个字节来表示一个符号)
5. ANSI
如开头的故事所讲,ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。
美国人的系统中ANSI编码其实是ASCII编码(ASCII编码不能表示汉字,汉字为乱码);
我们的系统中ANSI编码是GBK编码;
而韩文系统中ANSI编码其实是EUC-KR编码。
(当然了,跟哪国人没关系,具体是根据系统区域(locale)来设置的)