关于编码ANSI、GB2312、Unicode与UTF-8的区别
先做一个小小的试验:
在一个文件夹里,把一个txt文本(文本里包含"今天的天气非常好"这句话)分别另存为ANSI、Unicode、UTF-8这三种编码的txt文件。然后,在该文件夹上点击右键,选择"搜索(E)""。
搜索"天气"二字,可以搜索出ANSI和Unicode这两种编码的txt文件,搜索不出UTF-8编码的文件。(不一定)
原因:
1.中文操作系统默认ANSI编码,生成的txt文件默认为ANSI编码,所以,可以搜索出来。
2.Unicode是国际通用编码,所以,可以搜索出来。
3.UTF-8编码是Unicode编码在网络之间(主要是网页)传输时的一种"变通"和"桥梁"编码。UTF-8在网络之间传输时可以节约数据量。所以,使用操作系统无法搜索出txt文本。(UTF-8表示的大部分字符是西文字符时,可以节约数据量;如果大部分字符是非西文字符,反而会增大数据量。)
按照UTF-8创始人的愿望:
端(Unicode)——传输(UTF-8)——端(Unicode)
但是,后来,许多网站开发者在开发网页时直接使用UTF-8编码。 端(UTF-8)——传输(UTF-8)——端(UTF-8)
所以,在浏览器上看到的编码是:Unicode(UTF-8)。正因为在浏览器上这么并列地列出Unicode(UTF-8),造成许多网友(甚至不少程序员)误认为Unicode=UTF-8。其实,按照UTF-8创始人的原意,在开发网页时使用UTF-8编码是错误的做法,并且,早期的浏览器也不支持解析UTF-8编码。但是,众人的力量是巨大的,微软不得不"趋炎附势",在浏览器上支持解析UTF-8编码。
问题是:UTF-8编码影响了网站开发者,或者说,网站开发者"扩展"了UTF-8编码的使用范围。但是,网站开发者仍然无法影响各类文档的开发者,所以,Word文档和一些国际通用的文档仍然使用Unicode编码而不使用UTF-8编码。
比如:"严"的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。 在中文和日文操作系统里生成的(txt和xml)文件的编码虽然都是ANSI,但是,在简体中文系统下,ANSI 编码代表 GB2312 编码;在繁体中文系统下,ANSI 编码代表 Big5 编码;在日文操作系统下,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
结论:国际文档(txt和xml)使用Unicode编码是正宗做法;操作系统和浏览器都能够"理解"Unicode编码。浏览器"迫于压力"才"理解"UTF-8编码。但是,操作系统有时只认Unicode编码。
Unicode与Unicode big endian的区别:你吃鸡蛋时先吃小头还是先吃大头?Unicode与Unicode big endian的区别就是在编码时小头优先与大头优先的区别。"随波逐流"使用Unicode就OK了。
我(不是程序员)这几年一直因为编码问题,感到非常困惑,查了许多资料,在国际文档的实际应用中也遇到过许多问题,所以,"感性"地总结了上述观点,不一定准确(或者说,不一定正确)。
ANSI (American National Standards Institution 美国国家标准学会)相当于是各地区字符编码的别名,目的是为了兼容已经既成事实的各地区字符编码集。
因为Unicode是在各地区字符编码集(如中文的GB系列编码,繁文的Big5编码,日文的JIS编码等等)之后才出现的,而Windows在采用Unicode的时候要考虑和各国已有字符编码兼容,因此"中文版Windows操作系统"中的默认编码仍然采用GB系列编码;"繁体版Windows操作系统"中的默认编码仍然采用Big5编码;"日文版Windows操作系统"中的默认编码仍然采用JIS编码。而这些地区性编码在美国的MS公司看起来,它们都被统称为ANSI编码了。