字符编码知识大全

字符编码

目录

字符编码 (1)

目录 (2)

第一章字符与编码 (3)

1.1字符与编码的概念 (3)

1.2字符编码的发展历史。 (3)

1.3字符、字节、字符串与编码。 (5)

1.4常用字符编码简介 (6)

第二章字符编码详述 (8)

2.1 ASCII (8)

2.2 EASCII (9)

2.3 UCS (10)

2.4 Unicode (10)

2.5 UTF (11)

2.5.1 UTF-8 (12)

2.5.2 UTF-16 (13)

2.5.2 UTF-32 (13)

2.6 汉字编码 (13)

2.6.1 GB2312 (13)

2.6.2 BIG5 (14)

2.6.3 GB18030 (16)

2.6.3 GBK (17)

第三章字符编码与程序 (21)

3.2 程序、操作系统中的内码外码 (21)

3.2 C++与JAVA中的编码 (22)

3.2.1 C++中相关实现方法 (22)

3.2.2 JAVA中相关实现方法 (23)

第四章乱码及解决 (27)

4.1 因误解招致的乱码 (27)

4.2 非UNICODE程序在不同语言环境间移植时产生的乱码 (27)

4.3 网页提交字符串招致的乱码 (28)

4.4 从数据库读取字符串招致的乱码 (28)

4.5 电子邮件中的字符串乱码 (28)

4.6 “半个汉字”引发的乱码 (29)

4.7 全角半角转换引起的乱码 (29)

第五章编码转换及问题 (31)

5.1 编码识别 (31)

5.2 UTF8←→GBK (31)

5.2 不同浏览器下 (31)

第一章字符与编码

计算机中的信息包括数据信息和控制信息,数据信息又可分为数值和非数值信息。非数值信息和控制信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理,这种对字母和符号进行编码的二进制代码称为字符代码(Character Code)。

1.1字符与编码的概念

字符(Character)是各种文字与符号的总称,包括各国家文字、标点符号、图形符号、数学符号等。

字符集(Character set)是多个字符的集合。一组抽象字符的集合就是字符集。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。字符集的子集也是字符集。

字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

字符编码(Character Code):计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码。制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。

具有数字编码的字符在信息处理中,所使用的整数总有上限,依赖于存储整数的位的数目。这也决定了可以同时区分的字符的数量。在设计字符集时,首先要决定所需字符的数目,并确定所需字符的清单。根据字符的数目,可以设定整数值的上限,这个整数范围称为编码空间(code space),其中的一个特定整数称为一个码点(c ode point)。然后,为字符清单中的每个字符指定一个整数值,也就是一个码点。这样就得到一个字符集,称作编码字符集(Coded Character Set)。

每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Chara cter Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。

1.2字符编码的发展历史。

在最初的时候,美国人制定了第一张编码表《美国标准信息交换码》,简称ASCII,来支持英文。这是字符编码发展的阶段1.

美国人解决英文问题了,但欧洲人、中国人、韩国人、日本人都没解决问题,于是就各自开发了自己语言的字符编码,世界范围内就多了诸如ISO 8859、GB2312、BIG5、JIS 等局限于某个国家或地区使用的本地化编码标准,这些编码标准被统称为:ANSI编码。这是字符编码发展的阶段2.这些ANSI编码有一些共同的特点:

1) 每种ANSI编码或者说ANSI字符集只规定自己国家或地区使用的语言所需的'字符';比如中文GB-2312编码中就不会包含韩国人的文字。

2) ANSI字符集的空间都比ASCII要大很多,一个字节已经不够,绝大多数都使用了多字节的存储方案。

3) ANSI编码一般都会兼容ASCII码。

虽然有了各地区的编码,但各自不兼容,甚至于大陆简体中文的GB2312和台湾繁体中文的BIG5相互就出现乱码,于是在80年代就有了一个称为UNICODE 的组织,这个组织制定了一个能够覆盖几乎任何语言的编码表,在Unicode3.0.1中就包含了49194 个字符,将来,Unicode 中还会增加更多的字符。Unicode 的全称是Universal Multiple-Octet C oded Character Set ,简称为UCS。这是字符编码发展的阶段3。

由于要表示的字符如此之多,所以一开始的Unicode1.0编码就使用连续的两个字节也就是一个WORD 来表示编码,比如“汉”的UCS 编码就是6C49。这样在Unicode 的编码中就可以表示256*256 = 65536 种符号了。

直接使用一个WORD 相当于两个字节来保存编码可能是最为自然的Unicode 编码的方式,这种方式被称为UCS-2,也被称为ISO 10646,,在这种编码中,每

一个字符使用两个字节来进行表示,例如,“中”使用11598 来编码,而大写字母 A 仍然使用65 表示,但它占用了两个字节,高位用0 来进行补齐。

UCS-2 虽然理论上可以统一编码,但仍然面临着现实的困难。首先,UCS-2 不能与现有的所有编码兼容,现有的文档和软件必须针对Unicode 进行转换才能使用。即使是英文也面临着单字节到双字节的转换问题。其次,许多国家和地区已经以法律的形式规定了其所使用的编码,更换为一种新的编码不现实。比如在中国大陆,就规定GB2312 是大陆软件、硬件编码的基础。第三,现在还有使用中的大量的软件和硬件是基于单字节的编码实现的,UCS-2 的双字节表示的字符不能可靠的在其上工作。

为了尽可能与现有的软件和硬件相适应,美国人又制定了一系列用于传输和保存Unicode 的编码标准UTF,这些编码称为UCS 传输格式码,也就是将UCS 的编码通过一定的转换,来达到使用的目的。常见的有UTF-7,UTF-8,UTF-16等。

其中UTF-8 编码得到了广泛的应用。实际上,ASCII 字符用UTF-8 来表示后,与ASCII 是完全一样的,UTF-8 编码解决了字符的编码问题,又可以在现有的设备上通行,因此,得到了广泛的使用。美国人又近水楼台的把自己的问题解决了。但其他的编码就没有这么幸运了。

XML 的设计目标是实现跨网络,跨国界的信息表示,所以,在XML 设计之初,就规定XML 文件的默认编码格式就是UTF-8,也就是说,如果没有特殊的说明,X ML文件将被视为UTF-8 编码。

然而,大部分的中文编辑软件,是根据操作系统来决定编码的方式的,所以,在写字板中直接输入并保存的文件,将被保存为GB2312 编码,所以,在读出XML 文件内容时,往往就会出现文件错误的提示了。这种情况会出现在文件中有中文出现的时候,如果没有中文,只有英文信息,就不会出现问题。原因很简单,有中文时,因为中文的编码并不是UTF-8 编码,所以会造成冲突,没有中文时,英文的编码在GB2312 中与ASCII是兼容的,而ASCII 与UTF-8 是完全一致的,所以不会出现问题。这种情况也包括UltraEdit 软件。

但时,专业的XML编辑软件会自动将内容保存为UTF-8 编码,不会有问题。

在通过DOM或XSLT保存XML 文件时也有着同样的问题。

默认情况下,XML 的处理程序一般会将内容作为UTF-8 编码进行处理,所以保存下来的XML 文件必须要用可以识别UTF-8 的软件来进行查看,如Windows 的记事本。

1.3字符、字节、字符串与编码。

字符串在内存中的存放方法:

在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS )。比如,"Bob123" 在内存中为:

42 6F 62 31 32 33 00

B o b 1 2 3 \0

在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS ),因此,这种方式存放的字符也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:

D6 D0 CE C4 31 32 33 00

中 文 1 2 3 \0 在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNIC ODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)

来存放一个序号(D BCS ),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号:

2D 4E 87 65 31 00 32 00 33 00 00 00 ← 在 x86 CPU 中,低字节在前

中 文 1 2 3 \0

一共占 10 个字节。

由于不同 ANSI 编码所规定的标准是不相同的,因此,对于一个给定的多字节字

符串,我们必须知道它采用的是哪一种编码规则,才能够知道它包含了哪些“字符”。而对于 UNICODE 字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的。

1.4常用字符编码简介

第二章字符编码详述

在本章中,我将详细论述各个具体的编码,他们所包括的内容及特点。

2.1 ASCII

ASCII码于1968年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。

ASCⅡ码表.xls

名称由来

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是由美国国家标准局(ANSI)制定,目前计算机中用得最广泛的字符集及其编码。它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。

特点

它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO 646。

包含内容

因为1位二进制数可以表示2种状态:0、1;而2位二进制数可以表示4种状态:00、01、10、11;依次类推,7位二进制数可以表示128种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用七位二进制数进行编码的,可以表示128个字符,其中有96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有32 个控制字符。

第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;

第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

技术特征

单字节编码,7位(bits)表示一个字符,共128字符。编码空间:0x0~0x7F 共8bit

在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b 7) 在计算机内部通常保持为0 ,在数据传输时可用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高

位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

注:EBCDIC码(扩展的BCD交换码):一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统(MVS 、OS/390等)采用EB CDIC 编码。

2.2 EASCII

EASCII(Extended ASCII,延伸美国标准信息交换码) 是将ASCII码由7位扩充为8位而成,又叫ASCII扩展字符集。EASCII的内码是由0到255共有256个字符组成。EASCII码比ASCII码扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。

由于标准ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了ISO2022 标准,它规定了在保持与ISO646 兼容的前提下将ASCII 字符集扩充为8 位代码的统一方法。ISO 陆续制定了一批适用于不同地区的扩充ASCII 字符集,每种扩充ASCII 字符集分别可以扩充128 个字符,这些扩充字符的编码均为高位为 1 的8 位代码(即十进制数128~255 ),称为扩展ASCII 码(EASCII),具体由ISO 8859进行了规范:

ISO 8859,全称ISO/IEC 8859,是国际标准化组织(ISO)及国际电工委员会(IE C)联合制定的一系列8位字符集的标准。

ASCII收录了空格及94个“可印刷字符”,足以给英语使用。但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的变音字母,故可以使用ASCII 及控制字符以外的区域来储存及表示。除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、希伯来语等,都可以使用这个形式来储存及表示。

* ISO 8859-1 (Latin-1) - 西欧语言

* ISO 8859-2 (Latin-2) - 中欧语言

* ISO 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。

* ISO 8859-4 (Latin-4) - 北欧语言

* ISO 8859-5 (Cyrillic) - 斯拉夫语言

* ISO 8859-6 (Arabic) - 阿拉伯语

* ISO 8859-7 (Greek) - 希腊语

* ISO 8859-8 (Hebrew) - 希伯来语(视觉顺序)

* ISO 8859-8-I - 希伯来语(逻辑顺序)

* ISO 8859-9 (Latin-5 或Turkish) - 它把Latin-1的冰岛语字母换走,加入土耳其语字母。

* ISO 8859-10 (Latin-6 或Nordic) - 北日耳曼语支,用来代替Latin-4。

* ISO 8859-11 (Thai) - 泰语,从泰国的TIS620 标准字集演化而来。

* ISO 8859-13 (Latin-7 或Baltic Rim) - 波罗的语族

* ISO 8859-14 (Latin-8 或Celtic) - 凯尔特语族

* ISO 8859-15 (Latin-9) - 西欧语言,加入Latin-1欠缺的法语及芬兰语重音字母,以及欧元符号。

* ISO 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。

很明显,iso8859编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859编码来表示。而且在很多协议上,默认使用该编码。

2.3 UCS

通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。

UCS包含了已知语言的所有字符。除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的象形文字,U CS还包括大量的图形、印刷、数学、科学符号。

* UCS-2: 与unicode的2byte编码基本一样。

* UCS-4: 4byte编码, 目前是在UCS-2前加上2个全零的byte。

Unicode与UCS的关系:

ISO 与https://www.360docs.net/doc/f813249320.html,是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致.

2.4 Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码,由http:/ /https://www.360docs.net/doc/f813249320.html,制定,要将全世界常用文字都函括进去。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。但自从unicode2.0开始,unicode采用了与ISO 10646-1相同的字库和字码,ISO也承诺ISO10646将不会给超出0x10FFFF的UC S-4编码赋值,使得两者保持一致。

Unicode的编码方式与ISO 10646的通用字符集(Universal Character Set,U CS)概念相对应,目前的用于实用的Unicode版本对应于UCS-2,使用16位的编码空间:也就是每个字符占用2个字节,基本满足各种语言的使用。实际上目前版本的Unicode尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。

名称由来

Unicode字符集编码是Universal Multiple-Octet Coded Character Set通用多八位编码字符集的简称,是由一个名为Unicode 学术学会(Unicode Consortiu m)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理

及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月3 1日的Unicode 4.1.0。

特征

Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

编码方法

Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为004116 和字符“?”的编码为20AC16。所以“A”的编码书写为“U+0 041”。

出现原因与缺陷

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者和信息的读取者使用了不同的编码方式。如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码的意义。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。

2.5 UTF

Unicode 的实现方式不同于编码方式,一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。

Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为UTF)。

为什么要转换成某种格式呢?转换是为了传输和交换。一种好的UTF-x方案应该便于在不同的计算机之间使用网络传输不同语言和编码的文字,使得标准双字节的U nicode能够在现存的处理单字节的系统上正确传输。目前比较常见的UTF方案有三种:

UTF-16:其本身就是标准的Unicode编码方案,又称为UCS-2,它固定使用16 bits(两个字节)整数来表示一个字符。

UTF-32:又称为UCS-4,它固定使用32 bits(四个字节)整数来表示一个字符。

UTF-8:最广泛的使用的UTF方案,UTF-8使用可变长度字节来储存Unicode

字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。UT

F-8更便于在使用Unicode的系统与现存的单字节的系统进行数据传输和交换。与前两个方案不同:UTF-8以字节为编码单元,没有字节序的问题。

UTF有三种方案,那么如何在接收数据和存储数据时识别数据和指导识别数据采用的是哪个方案呢?在UTF编码方案中有一个叫做"ZERO WIDTH NO-BREAK SP ACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输或存储中。UCS规范建议我们在传输或存储字节流前,先传输字符" ZERO WIDTH NO-BREAK SPACE"。这样根据识别前面的"ZERO WIDTH NO-BR EAK SPACE"即可识别编码方案:

EF BB BF UTF-8

FE FF UTF-16/UCS-2, little endian

FF FE UTF-16/UCS-2, big endian

FF FE 00 00 UTF-32/UCS-4, little endian.

00 00 FE FF UTF-32/UCS-4, big-endian.

UTF与unicode的关系:

Unicode是一个字符集, 可以看作为内码.

而UTF 是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.

2.5.1 UTF-8

UTF-8 的全名是UCS Transformation Format 8, 即UCS 编码的8位传输格式,就是使用单字节的方式对UCS 进行编码,使Unicode 编码能够在单字节的设备上正常进行处理。

UTF-8是8bit变长编码,便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输,同时提高Unicode的编码效率(UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了)。

UTF-8使用可变长度字节来储存Unicode字符,对于常用字符集(ASCII中0~1 27字符)继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的朝鲜和汉语会意文字就要使用3字节。辅助平面字符则使用4字节。UTF-8编码

UTF-8的编码是这样得出来的,以”汉”这个字为例:“汉”字的Unicode编码是U +00006C49,然后把U+00006C49通过UTF-8编码器进行编码,最后输出的UTF-8编码是E6B189。

UTF-8 编码是变长的编码,对不同的Unicode 可能编成不同的长度

UCS-2 UTF-8

0000-007F 0- 127 0xxxxxxx

0080-07FF 128- 2047 110xxxxx 10xxxxxx

0800-FFFF 2048-65535 1110xxxx 10xxxxxx 10xxxxxx

例如 1 的Unicode 编码是31 00,在0-127之间,所以转换后即为31,而“中”字的UTF-8 Unicode 编码为11598,转换成UTF-8则为e4 b8 ad。

2.5.2 UTF-16

UTF-16:16bit编码,是变长码,大致相当于20位编码,值在0到0x10FFFF

之间,基本上就是unicode编码的实现,与CPU字序有关。UTF-16 使用一个或两个未分配的16 位代码单元的序列对Unicode 代码点进行编码。

2.5.2 UTF-32

UTF-32 即将每一个Unicode 代码点表示为相同值的32 位整数。

2.6 汉字编码

GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。

BIG5字集是港台繁体字集,共包括国标繁体汉字13053个。

GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。

GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。

2.6.1 GB2312

GB2312(信息交换用汉字编码字符集)是由我国国家标准总局1980年发布,1 981年5月1日开始实施的一套国家标准,标准号是GB2312—1980。它是计算机可以识别的编码,适用于汉字处理、汉字通信等系统之间的信息交换。基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。

这个码是唯一的,不会有重码字。把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。

GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

信息交换用汉字编码字符集和汉字输入编码之间的关系是,根据不同的汉字输入方法,通过必要的设备向计算机输入汉字的编码,计算机接收之后,先转换成信息交换用汉字编码字符,这时计算机就可以识别并进行处理;汉字输出是先把机内码转成汉字编码,再发送到输出设备。

编码空间94*94=8836,是双字节编码。编码范围为:高字节: 0xB0~0xF7 ,低字节: 0xA0~0xFE

名称的由来

GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。

特点

GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。

包含内容

GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共7445 个图形字符。其中包括67 63个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

技术特征

(1)分区表示:

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

各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;10-15区及88-94区则未有编码。

举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。

(2)双字节表示

在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

编码举例

以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。

2.6.2 BIG5

BIG5是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。

1983年10月,台湾国家科学委员会、教育部国语推行委员会、中央标准局、行政院共同制定了《通用汉字标准交换码》,后经修订于1992年5月公布,更名为《中文标准交换码》,BIG5是台湾资讯工业策进会根据以上标准制定的编码方案。

BIG5码是双字节编码方案,其中第一个字节的值在OXAO-OXFE之间,第二个字节在OX40-OX7E和OXA1-OXFE之间。

BIG5收录13461个汉字和符号,包括:

* 符号408个,编码位置A140-A3BE

* 常用字5401个,编码位置A440-C67E,包括台湾教育部颁布的《常用国字标准字体表》的全部汉字4808个,台湾教科书常用字587个,异体字6个。

* 次常用字7652个,编码位置C940-F9D5,包括台湾教育部颁布的《次常用国字标准字体表》的全部汉字6341个,《罕用国字标准字体表》中使用频率较高的字1 311个。

名称的由来

又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁(Acer)、神通(MiTAC)、佳佳、零壹(Zero One)、大众(FIC)创立,故称大五码。

Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。

特点

Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。耐人寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0 xDDFC)。

字符编码方法

Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

各编码范围对应的字符类型如下:0xA140-0xA3BF为标点符号、希腊字母及特殊符号,另外于0xA259-0xA261,存放了双音节度量衡单位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E为常用汉字,先按笔划再按部首排序;0xC940-0xF9D5为次常用汉字,亦是先按笔划再按部首排序。

Big5 的局限性

没有一个真正统一的汉字编码表

(1)BIG-5定义的13053个汉字,没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字、没有包含日文平假名及片假名字母。“游锡堃”和“游锡方方土”

例如台湾视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的一些部首用字

(如“亠”、“疒”、“辵”、“癶”等)、常见的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也没有收录到Big5之中。

(2)增补字集混乱:倚天Big5延伸、Big5+、Big-5E、Big5-2003…

(3)增补方案互不兼容

被unicode取代是必然

2.6.3 GB18030

名称的由来

GB 18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准

多字节字符集,编码空间160万

单字节:0x0~0x7F

双字节:高字节:0x81~0xFE 低字节:0x40~0x7E 0x80~0xFE(兼容G

BK)

四字节:第1、3字节:0X81~0XFE 第2、4字节:0X30~0X39

特点:

与gbk完全兼容,除了:欧元(€) GB18030 中A2 E3, 在GBK中是0x80

囊括汉字、日文假名、朝鲜语和中国少数民族文字

GB18030目前的最新版本是GB18030-2005。GB18030-2005与GB18030-200 0的编码体系结构是完全相同的。GB18030-2005相对于GB18030-2000主要有以下变化:

1、在四字节字符表中增加CJK统一汉字扩充B和已经在GB13000中编码的我国少数民族文字字符的字形。其实GB18030-2000已经映射了这些码位,但GB180 30-2000没有给出这些字符的字形。

2、调整字符的编码。

3、去掉了单字节编码的欧元符号(0x80)。

特点

GB 18030字符集标准的出台经过广泛参与和论证,来自国内外知名信息技术行业的公司,信息产业部和原国家质量技术监督局联合实施。

GB 18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了2 7484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。

编码方法

GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0×00至0×7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四字节部分采用GB/T 1 1383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。

包含的内容

双字节部分收录内容主要包括GB13000.1全部CJK汉字20902个、有关标点符号、表意文字描述符13个、增补的汉字和部首/构件80个、双字节编码的欧元符号等。四字节部分收录了上述双字节字符之外的,包括CJK统一汉字扩充A在内的GB 13000.1中的全部字符。

2.6.3 GBK

GBK 是又一个汉字编码标准,全称《汉字内码扩展规范》(GBK),英文名称C hinese Internal Code Specification ,中华人民共和国全国信息技术标准化技术委员会1995 年12 月 1 日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995 年12 月15 日联合以技监标函[1995] 229 号文件的形式,将它确

定为技术规范指导性文件,发布和实施。这一版的GBK 规范为 1.0 版。GB 即“国标”,K 是“扩展”的汉语拼音第一个字母。

GBK 向下与GB2312 编码兼容,向上支持ISO 10646.1 国际标准,是前者向后者过渡过程中的一个承上启下的标准。ISO 10646 是国际标准化组织ISO 公布的一个编码标准,即Universal Multilpe-Octet Coded Character Set(简称UCS),大陆译为《通用多八位编码字符集》,台湾译为《广用多八位元编码字元集》,它与Unicode 组织的Unicode 编码完全兼容。ISO 10646.1 是该标准的第一部分《体系结构与基本多文种平面》。我国1993 年以GB 13000.1 国家标准的形式予以认可(即GB 13000.1 等同于ISO 10646.1)。

GBK编码空间:23940,

字节范围:

单字节:0x00-0x7F

双字节: 高字节:0x81~0xFE (0x80 欧元符号€ )

低字节:0x40~0x7E 0x80~0xFE

低字节在0x40~0x7E的汉字都是一些生僻字符

GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了2100 3个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准G B13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定,1995年12月正式发布,目前中文版的WIN95、WIN98、W INDOWS NT以及WINDOWS 2000、WINDOWS XP等都支持GBK编码方案。

字汇:GBK 规范收录了ISO 10646.1 {ISO 10646 是一个包括世界上各种语言的书面形式以及附加符号的编码体系。其中的汉字部分称为“CJK 统一汉字”(C 指中国,J 指日本,K 指朝鲜)。而其中的中国部分,包括了源自中国大陆的GB 2312、GB 12345、《现代汉语通用字表》等法定标准的汉字和符号,以及源自台湾的CNS 11 643 标准中第1、2 字面(基本等同于BIG-5 编码)、第14 字面的汉字和符号。}中的全部CJK 汉字和符号,并有所补充。具体包括:

1. GB 2312 中的全部汉字、非汉字符号。

2. GB 13000.1 中的其他CJK 汉字。以上合计20902 个GB 化汉字。

3. 《简化字总表》中未收入GB 13000.1 的52 个汉字。

4. 《康熙字典》及《辞海》中未收入GB 13000.1 的28 个部首及重要构件。

5. 13 个汉字结构符。

6. BIG-5 中未被GB 2312 收入、但存在于GB 13000.1 中的139 个图形符号。

7. GB 12345 增补的 6 个拼音符号。

8. 汉字“○”。

9. GB 12345 增补的19 个竖排标点符号(GB 12345 较GB 2312 增补竖排标点符号29 个,其中10 个未被GB 13000.1 收入,故GBK 亦不收)。

10. 从GB 13000.1 的CJK 兼容区挑选出的21 个汉字。

11. GB 13000.1 收入的31 个IBM OS/2 专用符号。

码位分配及顺序:GBK 亦采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 之间,剔除xx7F 一条线。总计23940 个码位,共收入21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号883 个。

全部编码分为三大部分:

1. 汉字区。包括:

a. GB 2312 汉字区。即GBK/2: B0A1-F7FE。收录GB 2312 汉字676

3 个,按原顺序排列。

b. GB 13000.1 扩充汉字区。包括:

(1) GBK/3: 8140-A0FE。收录GB 13000.1 中的CJK 汉字6080 个。

(2) GBK/4: AA40-FEA0。收录CJK 汉字和增补的汉字8160 个。CJK

汉字在前,按UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《康熙字典》的页码/字位排列。

2. 图形符号区。包括:

a. GB 2312 非汉字符号区。即GBK/1: A1A1-A9FE。其中除GB 2312 的符号外,还有10 个小写罗马数字和GB 12345 增补的符号。计符号717 个。

b. GB 13000.1 扩充非汉字区。即GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“○”排列在此区。计符号166 个。

3. 用户自定义区:分为(1)(2)(3)三个小区。

(1) AAA1-AFFE,码位564 个。

(2) F8A1-FEFE,码位658 个。

(3) A140-A7A0,码位672 个。

第(3)区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新字符的可能性。

字形:GBK 对字形作了如下的规定:

1. 原则上与GB 13000.1 G列(即源自中国大陆法定标准的汉字)下的字形/笔形保持一致。

2. 在CJK 汉字认同规则的总框架内,对所有的GBK 编码汉字实施“无重码正形”(“GB 化”);即在不造成重码的前提下,尽量采用中国新字形。

3. 对于超出CJK 汉字认同规则的、或认同规则尚未明确规定的汉字,在GBK 码位上暂安放旧字形。这样,在许多情况下GBK 收入了同一汉字的新旧两种字形。

4. 非汉字符号的字形,凡GB 2312 已经包括的,与GB 2312 保持一致;超出GB 2312 的部分,与GB 13000.1 保持一致。

5. 带声调的拼音字母取半角形式。

ANSI和Unicode big endia:

我们在Windows系统中保存文本文件时通常可以选择编码为ANSI、Unicode、Unic ode big endian和UTF-8,这里的ANSI和Unicode big endia是什么编码呢? ANSI:

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

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

Unicode big endia:

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。

Unicode规范中推荐的标记字节顺序的方法是BOM(即Byte Order Mark)。

在UCS编码中有一个叫做ZERO WIDTH NO-BREAK SPACE的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

UCS规范建议我们在传输字节流前,先传输字符ZERO WIDTH NO-BREAK SPAC E。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。

因此字符ZERO WIDTH NO-BREAK SPACE又被称作BOM。

Windows就是使用BOM来标记文本文件的编码方式的。

相关文档
最新文档