认识常见的字符集编码

 

1.ASCII字符集与编码

    美国信息互换标准代码. 每一个ASCII码与8位二进制数对应.ASCII用一个字节来表示一个字符,最多能够扩展256种字符.

    常用英文字符,相应的十进制数是0~127.其最高位是0.


认识常见的字符集编码_第1张图片

 

 

    另有128个扩展ASCII码,由一些图形和画线符号组成.,最高位都是1.


认识常见的字符集编码_第2张图片

 

建议记住 A 的ASCII码为 65,0 的ASCII码为 48,大小写字母之间差为32.


 

 

2.ISO8859-1字符集与编码

    ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF.

    其中0x00-0x7F之间和ASCII编码一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号.

    ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言,希腊语,泰语,阿拉伯语,希伯来语对应的文字符号.欧元符号出现的比较晚,没有被收录在ISO-8859-1中.

    因为ISO-8859-1编码使用了单字节的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃.即把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题.这是个很重要的,MySQL数据库默认编码是Latin1就是利用了这个特性.

    备注:ISO-8859-1有时也称为Latin-1。

 

 

 

3.GB2312字符集与编码

      GB2312,中华人民共和国国家标准汉字信息交换用编码.全称<<信息交换用汉字编码字符集--基本集>>,简称国标码.共收入汉字6763个和非汉字图形字符682个.由国家标准总局发布,标准号是GB 2312-1980.1981年5月1日实施.

      GB2312是几乎所有中文系统和国际化软件都支持的中文字符集.GB2312通行于中国大陆和新加坡.

GB2312中,两个字符表示一个汉字,分别称为高位和低位.为了与ASCII编码区分开.中文字符的每一个字节的最高位都是1.

 

    GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字符号.这种表示方式也称为区位码。

01-09区为特殊符号.

16-55区为一级汉字,按拼音排序.

56-87区为二级汉字,按部首/笔画排序.

10-15区及88-94区则未有编码.

 

    例:"啊"是GB2312之中的第一个汉字,它的区位码是1601.

 

 

 

4.GBK字符集与编码

      为了对更多字符和符号进行编码.1995年12月,前电子部科技质量司和国际技术监督局标准化司颁布了GBK编码规范,即汉字内码扩展规范,其中K为扩展的汉语拼音中"扩"字的拼音声母.英文全称Chinese Internal Code Specification.

      GBK编码标准兼容GB2312,共收录汉字21003个,符号883个,并提供1894个造字码位,简繁体字融于一库.

      GBK是对GB2312-80的扩展,也就是CP936字码表(Code Page 936)的扩展(之前CP936和GB 2312-80一模一样)。

      windows操作系统的默认字符集为GBK.

备注:GBK只是规范,不是国家标准.

 

 

 

5.Unicode字符集

      Unicode(统一码,万国码,单一码).Unicode定义了足以代表人类所有可读字符的字符集.

      Unicode是计算机科学中的一种标准.它由Unicode 组织(The Unicode Consortium,一个非营利性的机构所运作)推出并主导Unicode发展.

 

UTF-8编码

      UTF-8是UNICODE的一种变长字符编码.由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到6个字节编码UNICODE字符.

 

      如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节.如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节.用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符. 

 

UTF-8编码的优点

  UTF-8编码可以通过屏蔽位和移位操作快速读写.字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易.字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM) .UTF-8 是字节顺序无关的.它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。

 

UTF-8编码的缺点

  无法从UNICODE字符数判断出UTF-8文本的字节数.因为UTF-8是一种变长编码它需要用2个字节编码那些用扩展ASCII字符集只需1个字节的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集.8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7位ASCII码.因此产生了UTF-7编码. UTF-8 在它的表示中使用值100xxxxx的几率超过50%, 而现存的实现如ISO 2022, 4873, 6429, 和8859系统,会把它错认为是C1 控制码。因此产生了UTF-7.5编码。

 

 

修正的UTF-8

      UTF-8保存使用标准UTF-8和修正的UTF-8有两点不同:

  修正的UTF-8中,null字符编码成2个字节(1100000010000000)而不是标准的1个字节(00000000),这样作可以保证编码后的字符串中不会嵌入null字符.因此如果在类C语言中处理字符串,文本不会在第一个null字符时截断(C字符串以null结尾).

  在标准UTF-8编码中,超出基本多语言范围(BMP-BasicMultilingualPlain)的字符被编码为4字节格式,但是在修正的UTF-8编码中,他们由代理编码对(surrogatepairs)表示,然后这些代理编码对在序列中分别重新编码.结果标准UTF-8编码中需要4个字节的字符,在修正后的UTF-8编码中将需要6个字节.

 

备注:

Unicode是字符集.UTF-8,UTF-16,UTF-32是编码规则.

java使用UTF-16表示内部文本,并支持用于字符串串行化的非标准的修正UTF-8编码.

 

 

补充:

(1)ANSI编码

 

    这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.

    在简体中文系统下,ANSI 编码代表 GB2312 编码.在日文操作系统下,ANSI 编码代表 JIS 编码.

    不同 ANSI 编码之间互不兼容,当信息在国际间流交时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

 

 

 

 

你可能感兴趣的:(字符编码)