经常被编码的问题搞得头大,所以有必要专门整理一下网上这样的文章。
ASCII (American Standard Code for Information Interchange)- 美国人用的
英语中广泛应用,因为只有26个字母,
那么我们要显示其他的字符怎么办?比如,中国字2560个都不止,放不下艾。于是就有
ANSI (American National Standards Institute)
其中
单字节内码 -- Single-Byte character sets (SBCS),可以支持256个字符编码,和ASCII兼容。
双字节内码 -- Double-Byte character sets)(DBCS),可以支持65000个字符编码.
显然,不可能把全世界所有可能用到的字符都放到这65000的有限集合内。于是,使用
Windows Code Pages
来区分不同语言的代码,比如简体中文编码GB2312,实际上它是ANSI的一个代码页936
当然,其实中文是如此的博大精深以至于...65000个也不太够用。这个我们后面论述。
然后就是Unicode和UCS,不过这个可以不烦了,因为他们商量好了不搞分歧。所以只要看Unicode.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.
当前,Unicode可以容纳 1,114,112 (= 2^20 + 2^16) 字符, 已经分配的约96,000个,而且兼容ISO-8859-1 ASCII。现在来看,Unicode就是很"耿直"地为每种语言中用到的字符分配一个代码......这样就可以避免:在这个代码页上搞出来的东西,到了其他代码页的系统上就是Q#·!#¥%!%!·。
那什么是UTF?就是 Unicode/UCS Transformation Format.用来传输的编码。
其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,
用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
那我们如何才能区分这个东西是UTF-8还是UTF-16还是UTF-32还是其他什么东西又或者根本就是别人乱写的呢?有BOM Byte Order Mark
具体可以参照下面给出的例子,自己建个文档就一目了然了。
那BigEndianUnicode 又是什么东东?
它和Unicode只是存储顺序不同,如"A"的unicode编码为65 00 其BigEndianUnicode编码为00 65
==============================
来个练习:
新建一个文本文档,输入1。然后保存。默认是以ANSI保存的。此时用UltraEdit打开,Ctrl+H切换到16位编辑模式。你会发现:31 ,就是1 的AscII 码。
然后用记事本打开,另存为,选择Unicode,然后用UltraEdit打开,16位编辑,你会发现:FF FE 31 00 ,其中FF FE就是BOM
然后另存为BigEndianUnicode,变成 FE FF 00 31 这个说过了,就是存储顺序问题。高八位低八位的顺序相反。
然后UTF-8,结果就是 FFFE3100
当然我们也可以用字母,或者汉字来试验,这里不再赘述。
==============================
关于汉字编码:
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是中国所有非手持/嵌入式计算机系统的强制实施标准.