常见编码有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)

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2022-12-23
  • 2021-05-12
  • 2022-01-12
  • 2021-10-04
  • 2022-12-23
猜你喜欢
  • 2021-09-10
  • 2021-04-27
  • 2021-06-18
  • 2022-02-09
  • 2021-08-07
  • 2021-07-12
相关资源
相似解决方案