两个遵守相同规范的编码标准
unicode 3.0(最新版本5.0)和ISO-10646。从Unicode2.0开始,unicode采用了与ISO 10646-1相同的字库和字码。ISO-10646也叫做UCS (Universal Character Set)。
几个术语:
UTF: Unicode/UCS Transformation Format
UTF-16: 16位编码。基本上是Unicode的双字节编码,额外附加空间用于非常用字符和未来扩充需要(一般很少用到),常用字符在0-0xFFFF,包括扩充空 间的范围是0-0×10FFFF,所以最长编码位数是21位。关于扩充空间,在ISO-10646有相对应的定义。由于它是一个变长码,与CPU字序有关 (例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。如果将49写在前面,就是little endian。),最节省空间,所以常作为网络传输的外码。UTF-16是Unicode的preferred encoding。
UTF-8: 由于UTF-16直接就是Unicode编码,没有变换,包含了0×00在编码内,这个在操作系统内(C语言)中有特殊意义(和ASCII不兼容?),会 引起问题,所以有时候需要采用UTF-8编码对Unicode的直接编码做一些变换。UTF-8对ASCII不作变换,进行8位编码,其他字符做变长编 码,每个字符1-3个字节。与CPU字序无关,可以在不同平台之间交流。
UCS-2: 与UTF-16基本一样。
UCS-4: 4字节编码,目前是在UCS-2前加上2个全零的byte。
内码:内码是指操作系统内部的字符编码。早期操作系统的内码是与语言相关的.现在的Windows在内部统一使 用Unicode,然后用代码页适应各种语言,“内码”的概念就比较模糊了。微软一般将缺省代码页指定的编码说成是内码,在特殊的场合也会说自己的内码是 Unicode,例如在GB18030问题的处理上。
字符集:charcterset 字符的集合,例如Unicode是一种字符集。
字符编码:Encoding 如何将二进制数据识别为字符的编码,一种编码表示的字符是有限的,常常一种编码设计为表示一种字符集。例如UTF-8,UTF-16是两种字符编码,它们能够表示Unicode字符集的所有字符。
中国国标编码:
GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.
GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.
GB
18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码,
地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码.
GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.
Update (20061114): ISO 8859-1:
ISO/IEC 8859-1,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入192个字母及符号,借以供使用变音符号的拉丁字母语言使用。
其他:
UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,我可
以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1
89来表示它。关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案。UTF-8的一个特别的好处是它与ISO-
8859-1完全兼容。UTF是“UCS Transformation Format”的缩写。
所谓代码页(code page)就是针对一种语言文字的字符编码。例如GBK的code page是CP936,BIG5的code page是CP950,GB2312的code page是CP20936。Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文本文件,里面的内容是字节流:BA、BA、D7、D6。Windows应该去怎么解释它呢?
是按照Unicode编码解释、还是按照GBK解释、还是按照BIG5解释,还是按照ISO8859-1去解释?如果按GBK去解释,就会得到“汉字”
两个字。按照其它编码解释,可能找不到对应的字符,也可能找到错误的字符。所谓“错误”是指与文本作者的本意不符,这时就产生了乱码。答案是Windows按照当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以通过控制面板的区域选项设置。记事本的另存为中有一项ANSI,其实就是按照缺省代码页的编码方法保存。
Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示,例如在HTML文件中就可以指定charset。
趣事:
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。
Resources:
1. 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解 国际化支持 USENIX.CN - powered by Sinoprise Technology Lab (有比较详细的介绍)
2. 无废话XML
5. ISO 8859-1
注:文中参考的不全是官方或权威资料,难免有错误,仅作学习用,本人对文中错误不负任何责任,并欢迎改正错误。

No comments:
Post a Comment