常见编码有UCS-2, UCS-4, UTF-8, UTF-16, UTF-32, ASCII, ANSI等等。
我们都知道ASCII,这是最早也是最简单的一种编码,美国人用1个字节(准确的来说是后7位,即0x00到0x7F)来编码英文字母、标点、数字等等,后来西方国家(法国、德国等)把最高位也利用上,来编码自己的语言字符(前128个字符与美国的一样,后面128个根据每个国家语言的不同而不同,比如法国的第200位是'é',而德国的第200位是'ä'),这样ASCII字符集就被扩展了。
可是,到了亚洲,编码一下子就复杂了?单单一门汉语,字符个数就是万级别的(常用的汉字大约3000个),更不用说还有韩文、日文等。我们国家也有自己的几套编码方案,如GB2312,GBK,GB18030等,同样的,日本有Shift-JIS等,韩国有 EUC-KR等。
ISO(国际标准化组织)决定要制订一个包含地球所有语种在内的通用字符集,这项项目叫做Unicode(Universal Multiple-Octet Coded Character Set,简称UCS),它从序号 0 开始对全球所有语种的字符进行编号,为了保证兼容,前128个字符就是最早的ASCII编码。其中UCS-2, UCS-4, UTF-8, UTF-16, UTF-32, GBK, BIG5, EUC-KR等等都是对Unicode的一种实现方式,前5种是全球通用的实现方式,后面3种是具体地区对Unicode的实现方式。
UCS-2:对每个字符都采用2个字节的编码方式,比如字母'a'的编码就是0x0061,可以表示2^16个字符,但是对纯英文文档,使用这种编码的文件是使用ASCII编码大小的2倍。(有些文本编辑器中的Unicode编码就是指此编码,一般而言,广义的Unicode表示上述提到的ISO制定的项目,侠义的Unicode表示以2个字节来编码字符的一种编码方式,等同于UCS-2)
UCS-4:和UCS-2一样,始终用4个字节表示一个字符,其实真正使用时只用了31位,最高位规定为0,而2^31=0x80000000,所以UCS-4的范围是[0x00000000, 0x7FFFFFFF],现在的Unicode编号只编到了0x10FFFF,这个范围已经包含了目前地球已知的所有语种字符,我们把每65536个字符称作一个平面,其中[0,65535]称为基本多文种平面(Basic Multilingual Plane,简称BMP),[65536,0x10FFFF]还有16个平面,所以[0,0x10FFFF]一共有17个平面。(平面是如何划分的?以及每个平面包含哪些内容?见附1)
UTF-8:全球最通用的编码方式,具体编码规则见附2。(Unicode转UTF-8的规则可以参阅百度百科:UTF-8)
UTF-16:是对UCS-2的扩展,位于基本平面的字符和UCS-2编码相同,后面的从第65536开始一直到0x10FFFF编号的字符是UTF-16新增的字符集,用4个字节编码。在一个UTF-16编码的文件,当遇到2个字节时,如何判断是代表1个字符还是和后面的2个字节组合在一起用4个字节表示的一个字符呢?所以UTF-16中引出了代理对的概念,在UTF-16中为了要表示剩下的16个平面的字符时(UTF-16范围是 0 到 0x10FFFF 为止的,共17个平面),在基本平面的0xD800~0xDFFF这些码点设为代理,一共可以代理1024的平方个字符(0xD800~0xDBFF共1024个,0xDC00~0xDFFF共1024个),正好是剩下的16个平面的范围,可以自行验算。
UTF-32:同UCS-4,始终用4字节编码一个字符。
GBK:前128个字符同ASCII,后面汉字编号的具体规则可以参阅相关的资料。
ANSI:该编码表示,当前的编码是基于ASCII扩展过来的(若一种编码的第0~127位与ANSII一样,就称此编码为ANSI),在Windows简体中文版中,默认的ANSI就是GBK,在Windows繁体中文版就是BIG5。
附1:
| 平面: | 编码范围: | 英文名: | 中文名: |
| 0号平面 | U+0000~FFFF | Basic Multilingual Plane | 基本多文种平面,简称BMP |
| 1号平面 | U+10000~1FFFF | Supplementary Multilingual Plane | 多文种补充平面,简称SMP |
| 2号平面 | U+20000~2FFFF | Supplementary Idographic Plane | 表意文字补充平面,简称SIP |
| 3号平面 | U+30000~3FFFF | Tertiary Ideographic Plane | 表意文字第三平面,简称TIP |
| 4~13号平面 | U+40000~DFFFF | None | 保留,尚未使用 |
| 14号平面 | U+E0000~EFFFF | Supplementary Special-purpose Plane | 特殊用途补充平面,简称SSP |
| 15号平面 | U+F0000~FFFFF | Private Use Area A | 私人使用平面A,简称PUA-A |
| 16号平面 | U+100000~10FFFF | Private Use Area B | 私人使用平面B,简称PUA-B |
附2:
| Unicode范围:(十六进制) | UTF-8表示格式: | 字节数: | 说明: |
| 0000~007F | 0XXX XXXX | 1 | 标准ASCII范围 |
| 0080~07FF | 110X XXXX 10XX XXXX{1} | 2 | 除东亚的基本世界字符(东亚字符占世界全部字符的70%) |
| 0800~FFFF | 1110 XXXX 10XX XXXX{2} | 3 | 基本平面 |
| 1 0000~1F FFFF | 1111 XXXX 10XX XXXX{3} | 4 | Unicode6.1定义的范围是[0,10FFFF] |
| 20 0000~3FF FFFF | 1111 10XX 10XX XXXX{4} | 5 | 无 |
| 400 0000~7FFF FFFF | 1111 110X 10XX XXXX{5} | 6 | 通用字符集的极限 |
附3:(常见的以数字标识的编码)
| 数字代码: | 编码名称: | 说明: |
| 37 | IBM037 | IBM EBCDIC (美国 - 加拿大) |
| 437 | IBM437 | OEM 美国 |
| 500 | IBM500 | IBM EBCDIC (国际) |
| 850 | IBM850 | 西欧字符 |
| 852 | IBM852 | 中欧字符 |
| 932 | Shift-JIS | 日语 |
| 936 | GBK | 简体中文 |
| 949 | KS_C_5601-1987 | 朝鲜语 |
| 950 | BIG5 | 繁体中文 |
字符串"a我易"在不同编码下的实现:
UTF-8:(61)( E6 88 91)( E6 98 93)
UTF-8 BOM:(EF BB BF)( 61)( E6 88 91)( E6 98 93)
GBK:(61)( CE D2)( D2 D7)
UCS-2:(FF FE)( 61 00)( 11 62)( 13 66)
UCS-2 BE:(FE FF)( 00 61)( 62 11)( 66 13)
UTF-16:(FF FE)( 61 00)( 11 62)( 13 66)
UTF-16 BE:(FE FF)( 00 61)( 62 11)( 66 13)
UTF-32:(FF FE 00 00)( 61 00 00 00 )(11 62 00 00 )(13 66 00 00)
UTF-32 BE:(00 00 FE FF)( 00 00 00 61 )(00 00 62 11)( 00 00 66 13)
字符串"a我\u{1D306}"在不同编码下的实现,其中\u{1D306}是一个非基本平面的字符,该字符为:?(有些浏览器可能不支持显示该字符,正常显示的话,该字符类似汉字“三”多一横)
UTF-8:(61)( E6 88 91)( F0 9D 8C 86)
UTF-16:(FF FE )(61 00 )(11 62 )(34 D8 06 DF)
UTF-32:(FF FE 00 00)( 61 00 00 00)( 11 62 00 00)( 06 D3 01 00)
文献参考:
1.百度百科
2.博客(CSDN、博客园、简书等),由于参考较多,也过于细碎,无法一一列举
3.千千秀字网站的一些资料(www.qqxiuzi.cn)