前言
计算机中的信息包括数据信息和控制信息,数据信息又可分为数值和非数值信息。非数值信息和控制信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理,这种对字母和符号进行编码的 二进制代码称为字符代码(Character Code)。计算机中常用的字符编码有 ASCII码(美国标准信息交换码)和 ebcdic码(扩展的 bcd交换码)。
(Unicode与 ucs)历史上有两个独立的创立单一字符集的组织:一个是国际标准化组织 IOS开展了 IOS/Iec 10646项目,名字叫“ Universal Multiple-Octet Coded Character Set”,简称 ucs。, 另一个是由统一码联盟多语言软件制造商组成的协会组织的 Unicode 项目——Unicode。
1991年,Unicode联盟与 IOS的工作组终于开始讨论 Unicode与 ucs的合并问题,虽然其后的合并进行了很多年,Unicode初版规范中的很多编码都需要被改写,Ucs也需要对码空间的使用进行必要限制,但成果是喜人的。
最终,两者统一了抽象字符集(即任何一个在 Unicode中存在的字符,在 ucs中也存在),且最靠前的65535个字符也统一了字符的编码。对于码空间,两者同意以一百一十万为限(即两者都认为虽然65536不够,但2的31次方又太大,一百一十万是个双方都可接受的码空间大小,也够用,当然,这里说的一百一十万只是个约数),Unicode将码空间扩展到了一百一十万,而 ucs将永久性的不使用一百一十万以后的码位。
也就是说,现在再讲 Unicode只包含65536个字符是不对的(Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10ffff,即通常所说的 Unicode 标量值,从 U+0000 到 U+Ffff 的字符集有时也称为 Basic Multilingual Plane (Bmp)。代码点大于 U+Ffff的字符称为增补字符。)。除了对已经定义的字符进行统一外,Unicode联盟与 IOS工作组也同意今后任何的扩展工作两者均保持同步,到 Unicode2.0时,Unicode的编码和 ucs的编码都基本一致。因此虽然从历史的意义上讲 Unicode与 ucs不是一回事(甚至细节上说也不是一回事),但现在提起 Unicode,指代两者均无不妥,也就是说"Unicode"与"Ucs"一样。GB2312编码汉字6763字,是在 windows 95出现以前,国内信息处理普遍采用的编码标准。GBK是在保持 GB2312原貌的基础上,将其字汇扩充至 IOS 10646中的 CJK 20902汉字,同时也就包容了台湾的工业标准 big5中的全部汉字,没有体系结构的变化。而 GB18030则不然,它是在 GBK的基础上做进一步扩充,不但把 CJK-扩展 a的6582汉字扩充进去,而且还改变了 GBK的体系结构。尽管 GB2312、Big5、GBK在某种程度上依然尚存,但 IOS 10646(GB13000/Unicode)已日渐成为主流编码。
查看工具
Windows有个系统工具叫做字符映射表,可以查看字体中的可用字符:开始--运行--Charmap.
Babelmap【字符映射表/字体浏览工具】比 windows自带的好用?谁知道呢.最新版本的 Babelmap支持 Unicode6.0.该软件可使用系统上安装的所有字体浏览 Unicode 标准中的所有字符,还带有拼音及部首检字法。
说明
字符集 是一种语言或多个或全部语言中所有不同文字的集合,在中文中尤为明显,GB2312和 GBK就是两种中文字符集。
字体是某种文字不同的美术字形,比如中文的宋体、楷体…………
字符集和字体有一些关系,比如,微软的宋体就包含了 GBK字符集的所有文字,而楷体就只 GB-2312中常用的6000多汉字的字形。
字符集是一个映射表。一个字符是用二进制数字表示的,但具体是什么字符,是根据字符集决定的。
字库有两种标准: Postscript字库和TrueType字库。这两种字体标准都是采用曲线方式描述字体轮廓,因此都可以输出很高质量的字形。TTF(TrueTypefont)是一种字库名称。TTF(TrueTypefont)是 apple公司和 Microsoft公司共同推出的字体文件格式,随着 windows的流行,已经变成最常用的一种字体文件表示方式。
ASCII (国际标准 IOS-646)
ASCII规定用7位二进制数字来表示英文字符,ASCII被定为国际标准之后的代号为 IOS-646。由于 ASCII码只使用了7个二进制位,也就是说一个字节可以表示的256个数字中,它仅使用了0~127这128个码位,剩下的128个码位便可以用来做扩展,用来表示一些特定语言所独有的字符,因此对这多余的128个码位的不同扩展,就形成了一系列 IOS-8859-*的标准。例如为英语作了专门扩展的字符集编码标准编号为 IOS-8859-1,也叫做 latin-1,为希腊语所作的扩展编号为 IOS-8859-7等,完整的列表可以参考《Java Internationalization》一书。
ASCII码于1961年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。ASCII码划分为两个集合:128个字符的标准 ASCII码和附加的128个字符的扩充和 ASCII码。比较 ebcdic。其中95个字符可以显示。另外33个不可以显示。 标准 ASCII码为7位,扩充为8位。
目前使用最广泛的西文字符集及其编码是 ASCII 字符集和 ASCII 码( ASCII 是 American Standard Code For Information Interchange 的缩写),它同时也被国际标准化组织( International Organization For Standardization, IOS )批准为国际标准。
031及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:Lf(换行)、Cr(回车)、Ff(换页)、Del(删除)、Bs(退格)、Bel(振铃)等;通信专用字符:Soh(文头)、Eot(文尾)、Ack(确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序而对文本显示有不同的影响。32126(共95个)是字符(32sp是空格),其中4857为0到9十个阿拉伯数字,6590为26个大写英文字母,97~122为26个小写字母,其余为一些标点符号、运算符号等。
Mbcs(Muilti-Bytes Charecter Set,多字节字符集)
为了扩充 ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, Big5, Jis 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 Ansi 编码,又称为"Mbcs(Muilti-Bytes Charecter Set,多字节字符集)"。在简体中文系统下,Ansi 编码代表 GB2312 编码,在日文操作系统下,Ansi 编码代表 Jis 编码,所以在中文 Windows下要转码成 GB2312,GBK只需要把文本保存为 ansi 编码即可。 不同 Ansi 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 Ansi 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字。这样就容易造成混乱。导致了 Unicode码的诞生。
其中每个语言下的 ansi编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到 Unicode,而 Unicode也可以转换到其他所有的编码。
Unicode与 ucs(国际通用字符集)
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的 Unicode是十六进制数4e25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别 Unicode和 ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:
- 出现了 Unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示 Unicode。
- Unicode在很长一段时间内无法推广,直到互联网的出现。
为什么使用 Unicode其实原因很简单,因为 Unicode比 ansi好用。 自从 windows2k开始,Win的系统内核开始完全支持并完全应用 Unicode编写,所有 ansi字符在进入底层前,都会被相应的 api转换成 Unicode。所以,如果你一开始就使用 Unicode,则可以减少转换的用时和 ram开销。 对于 java/.Net等这些“新”的语言来说,内置的字符串所使用的字符集已经完全是 Unicode了,最重要的是,目前世界上大多数程序用的字符集都是 Unicode,因为Unicode有利于程序国际化和标准化。
Unicode的另一个设计目标,对今天影响深远,那就是对所有字符都采用16位编码(即用一个大小不超过2的16次方的整数数字给每个字符编号,注意从这个意义上也可以看出,Unicode是一种编码字符集,而非字符集编码)。说这个设计目标对现今影响深远,完全不是表扬,因为到后来连 Unicode的设计者也发现,16位编码仅有65536个码位,远远不能容纳世界上所有的字符,但当意识到这个问题的时候,Unicode大部分的规范已经制定完毕,也有相当程度的普及,完全推倒重来是不现实的。这成了一个遗留问题,也是 surrogate Pair这种蹩脚解决方案的发端。
IOS一开始就确定了 ucs是一个31位的编码字符集(即用一个大小不超过2的31次方的整数数字为每个字符编号),这回真的足以容纳古往今来所有国家,所有语言所包含的字符了。虽然后来他们意识到,2的31次方个码位又实在太多了
Unicode在编码上和 ucs保持一致,在实现上有自己的规则,而 ucs只定义了编码标准。Unicode的实现形式上 有 UTF-8,UTF-16,UTF-32,还有 UTF-7等。Ucs编码也有自己的格式:UCS-2和 UCS-4等等。Unicode的编码可以和 UCS-2和 UCS-4保持一致。但是又略有不同。UTF-16是 UCS-2的扩展,UTF-32是 UCS-4的子集。也就是说,UTF-16的实现上对 code Point的支持范围超过 UCS-2,而 UTF-32对 code Point的表示却又在 UCS-4的范围之内。在编码层面上,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。UCS-2有216=65536个码位,UCS-4有231=2147483648个码位。 UCS-4根据最高位为0的最高字节分成2^7=128个 group。每个 group再根据次高字节分为256个 plane。每个 plane根据第3个字节分为256行 (Rows),每行包含256个 cells。当然同一行的 cells只是最后一个字节不同,其余都相同。Group 0的 plane 0被称作 basic Multilingual Plane, 即 bmp。或者说 UCS-4中,高两个字节为0的码位被称作 bmp。 将 UCS-4的 bmp去掉前面的两个零字节就得到了 UCS-2。在 UCS-2的两个字节前加上两个零字节,就得到了 UCS-4的 bmp。而目前的 UCS-4规范中还没有任何字符被分配在 bmp之外。
Unicode最初支持16位的 code Point,后来发现不够用,于是用 UTF-16扩展 UCS-2。在 bmp区域内的一片连续空间(U+D800~U+Dfff)的码位区段是永久保留不映射到字符,因此 UTF-16利用保留下来的0xd800-0xdfff区段的码位来对辅助平面的字符的码位进行编码。 所以,UTF-16能表示的范围最大能到 u+10ffff,包含1个基本平面(Bmp)和16个辅助平面。
理论上 UCS-4编码范围能达到 u+7fffffff,但是因为 Unicode和 IOS达成共识,只会用17个平面内的字符,所以 UTF-32是 UCS-4的子集。但是 UTF-16是定长的编码,和 UCS-4无论实现和编码都是基本一样的。当前,Unicode深入人心,且 UTF-8大行其道,Ucs编码基本被等同于 UTF-16,UTF-32了,所以目前 ucs基本谈出人们的视野中。(Windows Nt用的就是 UCS-2)
UTF-8
UTF-8就是在互联网上使用最广的一种 Unicode的实现方式。其他实现方式还包括 UTF-16和 UTF-32,不过在互联网上基本不用。UTF-8是 Unicode即(Ucs)的实现方式之一。
UTF(Ucs Transformation Format) 代表“通用字符集转换格式”。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有二条:
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和 ASCII码是相同的。
对于 n字节的符号(N>1),第一个字节的前 n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode码。
下表总结了编码规则,字母 x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007f | 0xxxxxxx
0000 0080-0000 07ff | 110xxxxx 10xxxxxx
0000 0800-0000 Ffff | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 Ffff | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面,还是以汉字“严”为例,演示如何实现 UTF-8编码。
已知“严”的 Unicode是4e25(100111000100101),根据上表,可以发现4e25处在第三行的范围内(0000 0800-0000 Ffff),因此“严”的 UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补0。这样就得到了,“严”的 UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是 e4b8a5。
Unicode与 UTF-8之间的转换
可以看到“严”的 Unicode码是4e25,UTF-8编码是 e4b8a5,两者是不一样的。它们之间的转换可以通过程序实现。 在 windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序 notepad.Exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。 里面有四个选项:Ansi,Unicode,Unicode Big Endian 和 UTF-8。
Ansi是默认的编码方式。对于英文文件是 ASCII编码,对于简体中文文件是 GB2312编码(只针对 windows简体中文版,如果是繁体中文版会采用 big5码)。
Unicode编码指的是 UCS-2编码方式,即直接用两个字节存入字符的 Unicode码。这个选项用的 little Endian格式。
Unicode Big Endian编码与上一个选项相对应。我在下一节会解释 little Endian和 big Endian的涵义。
UTF-8编码,也就是上一节谈到的编码方法。
选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。
Little Endian和 Big Endian 的区别
上一节已经提到,Unicode码可以采用 UCS-2格式直接存储。以汉字”严“为例,Unicode码是4e25,需要用两个字节存储,一个字节是4e,另一个字节是25。存储的时候,4e在前,25在后,就是 Big Endian
方式;25在前,4e在后,就是 Little Endian
方式。
这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。
因此,第一个字节在前,就是”大头方式“(Big Endian
),第二个字节在前就是”小头方式“(Little Endian
)。那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(Zero Width No-Break Space),用 feff表示。这正好是两个字节,而且 ff比 fe大1。 如果一个文本文件的头两个字节是 fe Ff,就表示该文件采用大头方式;如果头两个字节是 ff Fe,就表示该文件采用小头方式。
打开”记事本“程序 notepad.Exe,新建一个文本文件,内容就是一个”严“字,依次采用 ansi,Unicode,Unicode Big Endian 和 UTF-8编码方式保存。 然后,用文本编辑软件 ultraedit中的”十六进制功能“,观察该文件的内部编码方式。
Ansi:文件的编码就是两个字节“D1 Cf”,这正是“严”的 GB2312编码,这也暗示 GB2312是采用大头方式存储的。
Unicode:编码是四个字节“Ff Fe 25 4e”,其中“Ff Fe”表明是小头方式存储,真正的编码是4e25。
Unicode Big Endian:编码是四个字节“Fe Ff 4e 25”,其中“Fe Ff”表明是大头方式存储。
UTF-8:编码是六个字节“Ef Bb Bf E4 B8 A5”,前三个字节“Ef Bb Bf”表示这是 UTF-8编码,后三个“E4b8a5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。
- GB2312-80国家标准 ——《信息交换用汉字编码字符集--基本集》 1980年
1980年颁布了《信息交换用汉字编码字符集—基本集》的国标交换码,国家标准号为:GB2312-80,选入了6763个汉字,分为两级,一级字库中有3755个,是常用汉字,二级字库中有3008个,是次常用汉字;还选入了682个字符,包含有数字、一般符号、拉丁字母、日本假名、希腊字母、俄文字母、拼音符号、注音字母等。以前我国大陆的各种中文 dos版本、Windows3.1 /3.2版本,装入的字库都是国标一二级字库。
《GB2312-80》对 7445 个图形字符作了二进制数编码。
GB2312 也是 ansi编码里的一种,对 ansi编码最初始的 ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为 gb码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为 gb 2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持 gb 2312。
Gb 2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。
- Big5 ——《大五码》 1984年
Big-5码是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。地区标准号为:CNS11643,这就是人们讲的 big-5码。
Big-5码收录汉字13053个,分为常用字和次常用字两部分,各部分中的汉字按笔画/部首排列。其中常用字5401个,包括台湾教育管理部门颁布的《常用汉字标准字体表》中的全部汉字4808个,台湾中小学教科书常用字587个,异体字6个;次常用字7652个,包括台湾教育管理部门颁布的《次常用汉字标准字体表》的全部汉字6341个,《罕用汉字标准字体表》中使用频率较高的字1311个。
Big-5码的编码范围是 0x8140~0xfe7e、0x81a1~0xfefe,其中 0xa140~0xa17e、0xa1a1~0xa1fe 是图形符号区,0xa440~0xf97e、0xa4a1~0xf9fe 是汉字区。
- IOS10646.1国际标准 —— 《通用多八位编码字符集(Universal Character Set, Ucs) 》 1993年
国际标准化组织为了将世界各民族的文字进行统一编码,制定了 ucs标准。
国际标准 IOS10646.1-1993定义了通用八位编码字符集(Universal Character Set, Ucs),用于世界上各种语言的书面形式以及附加符号的表示、传输、交换、处理、存储、输入及显现。 Ucs是所有其它字符集标准的一个超集,它保证也其它字符集双向兼容,即编码间相互转换不会丢失任何信息。Ucs字符集 u+0000到 u+007f与 us-ASCII是一致的。
Ucs 的总体结构
Ucs 编码字符集的总体结构是一个四维编码空间,它包含 00 ~ 7f 共 128 个三维组,每一个三维组中包含 00 ~ Ff 共 256 个二维平面,每一个二维平面包含 00 ~ Ff 共 256 个一维行,每行共 256 个字位(00 ~ Ff),每个字位用一个字节二进制数表示。因此在 Ucs 中每一个字符用 4 个二进制数编码,以确定每个字符在编码空间的组、平面、行和字位。上述四个 8 位二进制数编码形式称为 Ucs 的四八位正则形式,记作 UCS-4。基本多文种平面
在 ucs 编码空间中 00组的 00平面称为基本多文种平面。在此平面包含了字母文字、音节文字和表意文字中通常使用的字符以及各种符号和数字。
基本多文种平面的组编码为 00h。Ucs 规定当正则形式的组、平面编码为 00h 时可以省略,因此安排在基本多文种平面上的字符可用两个字节的二进制数来表示,形成双八位编码字符集,记作 UCS-2。
基本多文种平面分成 A、I、O、R 四个区
A 区:代码位置从 0000 ~ 4dff,共 19903 个字位。此区用于字母文字、音节文字以及各种符号的编码,其中 0000 ~ 001f 和 007e ~ 009f 保留用于控制字符。
I 区:代码位置从 4e00 ~ 9fff,共 20992 个字位。此区用于中、日、韩()统一的表意文字,即中国、日本、韩国等三国汉字的编码。
O 区:代码位置从 A000 ~ Dfff,共 16384 个字位。此区目前未用,留作未来的标准化。
R 区:代码位置从 E000 ~ Fffd,共 8190 个字位。此区是限制使用区,用于专用字符、变形显现形式和兼容字符的编码。
CJK 统一汉字的编码
在 I 区统一编码的汉字共 20902 个,按部首—比画排序。其中中国用汉字约 17000 个,源字集是 Gb 基本集简化字,第一、三、五辅助集繁体字,现代汉语通用字表,邮电通信字符集,台湾地区的 CNS11643 《通用汉字标准交换码》,此外还吸收了香港用字 58 个,延边地区朝鲜族使用的“吏读”字 92 个。CJK 统一汉字编码字符集中日本用汉字和韩国用汉字源字集分别为日、韩两国的有关标准。
CJK-扩展 a
国际标准化组织在 IOS10646-2000 的基本平面(Bmp 或者 Unicode 3.0, 下简称 Unicode)编入了27,564 汉字(U+4e00~U+9fff以及 u+3400~U+4dff),既是2000年3月在 GB18030颁布时所建议支持的字汇。其中 u+3400~U+4dff部分的6582个汉字又称为 CJK-扩展 a。
同时国际标准化组织还在 IOS10646-2000 的第二平面扩展了42,711汉字(又称为 CJK-扩展 b)。该42,711 汉字的编码表已基本确定,尽管不排除未来微小变动的可能性。也就是说,到目前为止 Unicode已编码的汉字达七万多字。CJK-扩展 b
国际标准化组织还在 IOS10646-2000 的第二平面扩展了42,711汉字(又称为 CJK-扩展 b)CJK-扩展 b 的42,711汉字编排在 IOS10646-2000的第二平面,所以编码需要4个字节。为存取处理这些4字节字符,在 Unicode 中引入了 surrogate 机制(在 IOS10646-2000中命名为 UTF-16)。根据这样一种机制, 在 Unicode中用两个16位编码就可以对 IOS10646-2000 第二平面中的汉字进行存取。Microsoft 从 windows2000 (在 windows 98, Windows Me 及 Windows Nt4 中没有)开始对这样一种机制提供支持。只要有相应的输入法和字库并且在应用程序中给予相应的支持,就应该能够输入显示上述提到的汉字。但是,要想得到对 surrogate全面的支持,用户需先下载并安装 surrogate Package ( Surrogate支持包 )。
支持 CJK-扩展 b汉字显示的字体:
简体中文版 Microsoft Office Xp及更高版本附带了宋体-超大字符集中文字体 ,支持上面提到的全部27,564个汉字以及在第二平面中(42,711)选出的36,862个在中国大陆、香港特别行政区(以及部分台湾地区)使用的汉字。因此包括西文等常用字符在内,宋体-方正超大字符集共包括65,531个字符。换言之,它支持 CJK-扩展 a中的全部汉字和 CJK-扩展 b中的部分汉字。
繁体中文版 Microsoft Office Xp及更高版本则提供了支持超大字符集的细明体(Mingliu Ext-B 与 Pmingliu Ext-B),可以从已装有 office的电脑中单独找到该字体文件,复制到本机 windows系统下的 fonts文件夹中即可。需要注意的是,此字体全面支持 CJK-扩展 b中的42711字,但不支持 CJK-扩展 a中的6582字。
海峰五笔 Unicode超大字符集字体支持包:完美结合了大陆与港台的数种主流字体,支持 GBK、GB-18030、CJK-B各大字符集内全部简、繁体汉字的显示, 通用于 windows 98/Nt/2000/Me/Xp/2003系统。安装此包之后,用宋体即可显示任何汉字。
GB13000.1国家标准 ——《CJK 统一汉字编码字符集》即GBK(“国家标准扩展”的拼音缩写)
1993年国家标准 GB13000.1 是完全等同于国际标准 IOS10646.1,国际标准化组织为了将世界各民族的文字进行统一编码,制定了 ucs标准。根据这一标准,中、日、韩三国共同制定了《CJK统一汉字编码字符集》,其国际标准号为:IOS/Iec10646,国家标准号为:GB13000-90,该汉字编码字符集就是通常人们所说的大字符集,它编入了20902个汉字,收集了大陆一二级字库中的简体字,台湾《通用汉字标准交换码》中的繁体字,58个香港特别用字和92个延边地区朝鲜族“吏读”字,甚至涵盖了日文与韩文中的通用汉字,满足了方方面面的需要。Windows95/98/Nt/2000中都装入了大字符集汉字库,人们一般称它为 GBK(“国家标准扩展”的拼音缩写)。
汉字扩展内码规范--GBK的目的是解决汉字收字不足、简繁同平面共存、简化代码体系间转换等汉字信息交换的瓶颈问题,并在保持已有应用软件兼容性的前提下,向最终的国际统一双字节字符集标准 IOS10646.1 迈进。
扩展的汉字内码规范的原则
与 《信息交换用汉字编码字符集--基本集》即国家标准 的内码体系标准完全兼容。在字汇一级支持 IOS 10466.1/《CJK统一汉字编码字符集》即国家标准 的全部 汉字。非汉字符号同时涵盖大部分常用的 非汉字符号。规范的名称与简称
中文名称:汉字内码规范
英文名称:Chinese Internal Code Specification
简称: GBK ( K 是“扩展”的汉语拼音第一个字母)规范的内容适用范围
作为非 Ucs (IOS 10646) 体系的代码页(Code Page),适用于中文信息的处理、交换、存储、显现、输入和输出。
GB18030-2000国家标准 ——《信息交换用汉字编码字符集基本集的扩充》2000年
2000年3月,国家信息产业部和质量技术监督局在北京联合发布了《信息技术和信息交换用汉字编码字符集、基本集的扩充》,国家标准号为:GB18030-2000,收录了27000多个汉字,还收录了藏、蒙、维等主要少数民族的文字,该标准于2000年12月31日强制执行。 Gb 18030-2000 作为 GBK For Unicode 3.0 的更新而诞生,并且 作为 GB2312-1980《信息交换用汉字编码字符集 基本集》的扩展,向下兼容
GB18030 编码是一二四字节变长编码:一字节部分从 0x0~0x7f 与 ASCII 编码兼容。二字节部分, 首字节从 0x81~0xfe, 尾字节从0x40~0x7e 以及0x80~0xfe,与 GBK标准基本兼容。四字节部分, 第一字节从 0x81~0xfe, 第二字节从 0x30~0x39, 第三和第四字节的范围和前两个字节分别相同。四字节部分覆盖了从 0x0080 开始, 除去二字节部分已经覆盖的所有 Unicode3.0码位。也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,GB18030是我国继 GB2312-1980和 GB13000-1993之后最重要的汉字编码标准,是未来我国计算机系统必须遵循的基础性标准之一。
Base64
有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输,
Base64编码
这是历史原因造成的(认为只有美国会使用电子邮件?)。因为一个英文字母使用 ASCII编码来存储,占存储器的1个字节(8位),实际上只用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。而有的编码方案(比如 GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0,这样收到邮件的人就会发现邮件乱码。
为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成 ASCII码来传输。比如,在一端发送 GB2312编码->根据 Base64规则->转换成 ASCII码,接收端收到 ASCII码->根据 Base64规则->还原到 GB2312编码。