关于字符编码的各种疑难解答(多方收集整理)

来源:互联网 发布:win10配置php 编辑:程序博客网 时间:2024/05/16 00:54

1、标准编号:GB2312-1980
标准名称:信息交换用汉字编码字符集 基本集
标准状态:现行
英文标题:Code of Chinese Graphic Character Set for Information Interchange; Primary Set
实施日期:1981-10-01
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。GB2312 收录简化汉字及符号、字母、日文假名等共 7445 个图形字符,其中汉字占 6763 个。GB2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312 将代码表分为 94 个区,对应第一字节;每个区 94 个位,对应第二字节,两个字节的值分别为区号值和位号值加 32(2OH),因此也称为区位码。01-09 区为符号、数字区,16-87区为汉字区,10-15 区、88-94 区是有待进一步标准化的空白区。GB2312 将收录的汉字分成两级:第一级是常用汉字计 3755 个,置于 16-55 区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。故而GB2312最多能表示 6763 个汉字。GB2312 的编码范围为 2121H-777EH,与 ASCII 有重叠,通行方法是将 GB 码两个字节的最高位置 1 以示区别。

 

2、GBK
1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。GBK是GB18030的子集 ,  GBK是包括中日韩字符的大字符集合。在90年代初期,制定了一个GBK的规范,就是在大陆的6763字后面,增加BIG5里面的15000汉字的部分.这个部分是字型与台湾的字型是一样的,但是编码仍然是SO2022.全国信息技术化技术委员会于1995年12月1日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。
GBK 共收入 21886 个汉字和图形符号,包括:
* GB2312 中的全部汉字、非汉字符号。
* BIG5 中的全部汉字。
* 与 ISO 10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
* 其它汉字、部首、符号,共计 984 个。
微软公司自 Windows 95 简体中文版开始支持GBK代码,但目前的多数搜索引擎都不能很好地支持 GBK 汉字。
GBK 编码区分三部分:
* 汉字区,包括:
GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;
GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;
GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。
* 图形符号区,包括:
GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号
GBK/5:OXA840-A9AO,扩除非汉字区。
* 用户自定义区:
即 GBK 区域中的空白区,用户可以自己定义字符。

 

3、标准编号:GB18030-2005
标准名称:信息技术 中文编码字符集
标准状态:现行
英文标题:Information Technology -- Chinese Coded Character Set
替代情况:GB18030-2000
实施日期:2006-05-01
颁布部门: 国家标准化管理委员会
内容简介:本标准规定了信息技术用的中文图形字符及其二进制编码的十六进制表示。
2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。 GB18030 编码是一二四字节变长编码。一字节部分从 0x0~0x7F 与 ASCII 编码兼容。 二字节部分, 首字节从0x81~0xFE, 尾字节从 0x40~0x7E 以及0x80~0xFE, 与 GBK 标准基本兼容。 四字节部分, 第一字节从 0x81~0xFE, 第二字节从 0x30~0x39, 第三和第四字节的范围和前两个字节分别相同。四字节部分覆盖了从 0x0080 开始, 除去二字节部分已经覆盖的所有 Unicode 3.1 码位。也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。目前最新的 glibc 2.2.x 系列已经全面支持了 GB18030 Locale 和 GB18030 与 UCS-4 之间的编码转换, 也就是说在系统层上 Linux 已经可以支持 GB18030 标准了。 下面问题的关键就是怎样让 XFree86 窗口系统也支持 GB18030 标准。

 

4、GB13000
GB13000 等同于国际标准的《通用多八位编码字符集 (UCS)》 ISO10646.1,就是等同于 Unicode 的标准,代码页等等的都使用UTF的一套标准。GB13000.1就是ISO/IEC 10646-1的中文版,相当于Unicode 1.1。GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。例如:UCS的0x3400在GB18030中的编码应该是8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。微软提供了GB18030的升级包,但这个升级包只是提供了一套支持CJK扩展A的6582个汉字的新字体:新宋体-18030,并不改变内码。Windows 的内码仍然是GBK。从 ASCII、GB2312、GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为 0。按照程序员的称呼,GB2312、GBK 到 GB18030 都属于双字节字符集 (DBCS)。

 

5、BIG5
BIG5 是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。
1983年10月,台湾国家科学委员会、教育部国语推行委员会、中央标准局、行政院共同制定了《通用汉字标准交换码》,后经修订于1992年5月公布,更名为《中文标准交换码》,BIG5 是台湾资讯工业策进会根据以上标准制定的编码方案。BIG5 码是双字节编码方案,其中第一个字节的值在0XA0-0XFE之间,第二个字节在0X40-0X7E和0XA1-0XFE之间。BIG5 收录13461个汉字和符号,包括:
* 符号 408 个,编码位置 A140-A3BE
* 常用字 5401 个,编码位置 A440-C67E,包括台湾教育部颁布的《常用国字标准字体表》的全部汉字 4808 个,台湾教科书常用字 587 个,异体字 6 个。
* 次常用字 7652 个,编码位置 C940-F9D5,包括台湾教育部颁布的《次常用国字标准字体表》的全部汉字 6341 个,《罕用国字标准字体表》中使用频率较高的字 1311 个。

 

6、关于Unicode和UTF-8
UTF-8即Unicode Transformation Format -- 8 bit,是Unicode传送格式。即把Unicode文件转换成BYTE的传送流。一个Unicode码可能转成长度为一个byte或两个,三个,四个byte的UTF-8码,取决于Unicode码的值。英文Unicode码因为值小于0x80,只要用一个byte的UTF-8传送,比送Unicode两个byte快。UTF-8是为传送Unicode而想出来的“再编码”方法罢了。

 

7、关于大端序(Big-Endian)和小端序(Little-Endian)
术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。
小端(低字节数据)存在起始地址(低地址单元),即是小端字节序;大端存在起始地址,即是大端字节序。
例如汉字'喵' 的Unicode 16进制编码为 16进制数 0x55B5 ,传输方式:
大端通讯:0x55 0xB5
小端通讯:0xB5 0x55
BOM是针对单个字符的本身的多字节编码而言的,如果字符的编码都是使用一个字节来编码则不存在字节序的问题,例如ASCII编码就不会存在字节序问题。接收的二进制数据按每8位1字节,每字节使用2个十六进制字符编码为Unicode后,存在一个问题,如何区别是高位在前还是高位在后。Unicode规范中有一个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且,编码为FFFE的字符在Unicode中不存在,因此在存储文件或在网络传输字节流时,可以用这个字符来标记大端通讯和小端通讯。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。在存储文件时,如果一个文本文件的头两个字节是FEFF,就表示该文件采用大端方式;如果头两个字节是FFFE,就表示该文件采用小端方式。由于UTF-8多字节编码方式定义其第一个字节的前几位使用 1 来声明该字符占多少个字节,因此,UTF-8编码方式不存在编码字节顺序的问题,但是仍然可以给UTF-8字节数据加上大端小端标记(带BOM 的UTF-8编码格式)。BOM对于UTF-8格式文件是没实用意义的,因此一般推荐保存为不带BOM的UTF-8格式。

 

8、UTF-8与UTF-16与UTF-32
UTF-8是变长编码,每个Unicode代码点按照不同范围,可以有1-3字节的不同长度。UTF-8是压缩的Unicode编码方式。
UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-16即4字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。
UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE。
UTF编码有个优点,即尽管编码字节数不等,但是不像GB2312/GBK编码一样,需要从文本开始寻找,才能正确对汉字进行定位。在UTF编码下,根据 相对固定的算法,从当前位置就能够知道当前字节是否是一个代码点的开始还是结束,从而相对简单的进行字符定位。不过定位问题最简单的还是UTF-32,它根本不需要进行字符定位,但是相对的大小也增加不少。

 

9、(机)内码
汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。输入码被接受后就由汉字操作系统的“输入码转换模块”转换为机内码,与所采用的键盘输入法无关。机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理。汉字在计算机内部其内码是唯一的。因为汉字处理系统要保证中西文的兼容,当系统中同时存在ASCII码和汉字国标码时,将会产生二义性。例如:有两个字节的内容为30H和21H,它既可表示汉字“啊”的国标码,又可表示西文“0”和“!”的ASCII码。为此,汉字机内码应对国标码加以适当处理和变换。国标码的机内码为二字节长的代码,它是在相应国标码的每个字节最高位上加“1”,即
汉字机内码=汉字国标码+8080H
例如,上述“啊”字的国标码是3021H,其汉字机内码则是B0A1H。
汉字机内码的基础是汉字国标码。
机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加2020H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码。
举例:机内码位BEDF,求区位码?
有两种解法:
1.BEDFH-A0A0H=1E3FH=3063D;
2.BEDFH-8080H=3E5FH(国标码),3E5FH-2020H=1E3FH=3063D.

0 0