汉字编码及区位码查询算法

上传人:飞*** 文档编号:40621836 上传时间:2018-05-26 格式:DOC 页数:4 大小:37.50KB
返回 下载 相关 举报
汉字编码及区位码查询算法_第1页
第1页 / 共4页
汉字编码及区位码查询算法_第2页
第2页 / 共4页
汉字编码及区位码查询算法_第3页
第3页 / 共4页
汉字编码及区位码查询算法_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《汉字编码及区位码查询算法》由会员分享,可在线阅读,更多相关《汉字编码及区位码查询算法(4页珍藏版)》请在金锄头文库上搜索。

1、汉字编码及区位码查询算法1汉字编码及区位码查询算法汉字编码及区位码查询算法为了使每一个汉字有一个全国统一的代码,1980 年,我国颁布了第一个汉字编码的国家 标准:GB2312-80信息交换用汉字编码字符集基本集,这个字符集是我国中文信息处 理技术的发展基础,也是目前国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000信息交换用汉字编码字符集基本集的扩充 ,简称 GB18030。由于国标码 是四位十六进制,为了便于交流,大家常用的是四位十进制的区位码。所有的国标汉字与 符号组成一个 9494 的矩阵。在此方阵中,每一行称为一个“区“,每一列称为一个“位“,因此, 这个方

2、阵实际上组成了一个有 94 个区(区号分别为 0 1 到 94)、每个区内有 94 个位(位号分 别为 01 到 94)的汉字字符集。一个汉字所在的区号和位号简单地组合在一起就构成了该汉 字的“区位码“。在汉字的区位码中,高两位为区号,低两位为位号。在区位码中,01-09 区 为 682 个特殊字符,16-87 区为汉字区,包含 6763 个汉字 。其中 16-55 区为一级汉字 (3755 个最常用的汉字,按拼音字母的次序排列),56-87 区为二级汉字(3008 个汉字,按部 首次序排列)。从汉字到区位码的转换。区位码是与汉字一一对应的编码,用四位数字表示, 前两位 从 01 到 94 称

3、区码,后两位从 01 到 94 称位码。 一个汉字的前一半为“160区码”的字符, 后一半为“160 位码”的字符。例如:“刘”的区位码是 3385,其意为区码 33 位码 85,它 是由 16033=193 和 16085=245 的两个字节组成。即 C1F5,它就是汉字的 gb2312 编 码。 下面程序将汉字 gb2312 转为相应的区位码: #include #include using namespace std;int main() / temp0 为高字节,temp1 为低字节/ 当输入单个 ascii 字符时,只存进 temp0/ 当输入的不是中文或单个 ascii 字符时,程

4、序退出unsigned char temp2;cin temp;while(temp1)cout temp;return 0; 字符编码简介字符编码简介Unicode 是一种字符编码规范。先从 ASCII 说起。ASCII 是用来表示英文字符的一种编 码规范,每个 ASCII 字符占用 1 个字节(8bits) 。因此,ASCII 编码可以表示的最大字符数 是 256,其实英文字符并没有那么多,一般只用前 128 个(最高位为 0) ,其中包括了控制 字符、数字、大小写字母和其他一些符号 。而最高位为 1 的另 128 个字符被成为“扩展 ASCII”,一般用来存放英文的制表符、部分音标字符等

5、等的一些其他符号。这种字符编码汉字编码及区位码查询算法2规范显然用来处理英文没有什么问题。 (实际上也可以用来处理法文、德文等一些其他的西 欧字符,但是不能和英文通用) ,但是面对中文、阿拉伯文之类复杂的文字,255 个字符显 然不够用,于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫 做“GB2312-80”,它是和 ASCII 兼容的一种编码规范,其实就是利用扩展 ASCII 没有真正 标准化这一点,把一个中文字符用两个扩展 ASCII 字符来表示。但是这个方法有问题,最 大的问题就是,中文文字没有真正属于自己的编码,因为扩展 ASCII 码虽然没有真正的标 准化,但是

6、 PC 里的 ASCII 码还是有一个事实标准的(存放着英文制表符) ,所以很多软件 利用这些符号来画表格。这样的软件用到中文系统中,这些表格符就会被误认作中文字, 破坏版面。而且,统计中英文混合字符串中的字数,也是比较复杂的,我们必须判断一个 ASCII 码是否扩展,以及它的下一个 ASCII 是否扩展,然后才“猜”那可能是一个中文字 。总之当时处理中文是很痛苦的。而更痛苦的是 GB2312 是国家标准,台湾当时有一个 Big5 编码标准,很多编码和 GB 是相同的,所以,嘿嘿。这时候,我们就知道,要真 正解决中文问题,不能从扩展 ASCII 的角度入手,也不能仅靠中国一家来解决。而必须有

7、一个全新的编码系统,这个系统要可以将中文、英文、法文、德文等等所有的文字统 一起来考虑,为每个文字都分配一个单独的编码,这样才不会有上面那种现象出现。于是, Unicode 诞生了。 Unicode 有两套标准,一套叫 UCS-2(Unicode-16),用 2 个字节为字符 编码,另一套叫 UCS-4(Unicode-32),用 4 个字节为字符编码。以目前常用的 UCS-2 为例, 它可以表示的字符数为 216=65535,基本上可以容纳所有的欧美字符和绝大部分的亚洲字 符 。UTF-8 的问题后面会提到。在 Unicode 里,所有的字符被一视同仁。汉字不再使用 “两个扩展 ASCII”

8、,而是使用“1 个 Unicode”,注意,现在的汉字是“一个字符”了,于是, 拆字、统计字数这些问题也就自然而然的解决了。但是,这个世界不是理想的,不可能在 一夜之间所有的系统都使用 Unicode 来处理字符,所以 Unicode 在诞生之日,就必须考虑 一个严峻的问题:和 ASCII 字符集之间的不兼容问题。我们知道,ASCII 字符是单个字节 的,比如“A”的 ASCII 是 65。而 Unicode 是双字节的,比如“A”的 Unicode 是 0065,这就 造成了一个非常大的问题:以前处理 ASCII 的那套机制不能被用来处理 Unicode 了。另一 个更加严重的问题是,C 语

9、言使用0作为字符串结尾,而 Unicode 里恰恰有很多字符都有 一个字节为 0,这样一来,C 语言的字符串函数将无法正常处理 Unicode,除非把世界上所 有用 C 写的程序以及他们所用的函数库全部换掉。于是,比 Unicode 更伟大的东东诞生了, 之所以说它更伟大是因为它让 Unicode 不再存在于纸上,而是真实的存在于我们大家的电 脑中。那就是:UTF。UTF = UCS Transformation Format UCS 转换格式。它是将 Unicode 编码规则和计算机的实际编码对应起来的一个规则。现在流行的 UTF 有 2 种:UTF-8 和 UTF-16。其中 UTF-16

10、 和上面提到的 Unicode 本身的编码规范是一致的,这里不多说了。 而 UTF-8 不同,它定义了一种“区间规则”,这种规则可以和 ASCII 编码保持最大程度的兼 容。UTF-8 有点类似于 Haffman 编码,它将 Unicode 编码为 00000000-0000007F 的字符, 用单个字节来表示;00000080-000007FF 的字符用两个字节表示 00000800-0000FFFF 的字 符用 3 字节表示。因为目前为止 Unicode-16 规范没有指定 FFFF 以上的字符,所以 UTF-8 最多是使用 3 个字节来表示一个字符。但理论上来说,UTF-8 最多需要用

11、6 字节表示一个 字符。在 UTF-8 里,英文字符仍然跟 ASCII 编码一样,因此原先的函数库可以继续使用。 而中文的编码范围是在 0080-07FF 之间,因此是 2 个字节表示(但这两个字节和 GB 编码 的两个字节是不同的) ,用专门的 Unicode 处理类可以对 UTF 编码进行处理。 下面说说 中文的问题。由于历史的原因,在 Unicode 之前,一共存在过 3 套中文编码标准。 GB2312-80,是中国大陆使用的国家标准,其中一共编码了 6763 个常用简体汉字。Big5, 是台湾使用的编码标准,编码了台湾使用的繁体汉字,大概有 8 千多个。HKSCS,是中国 香港使用的编

12、码标准,字体也是繁体,但跟 Big5 有所不同。这 3 套编码标准都采用了两个汉字编码及区位码查询算法3扩展 ASCII 的方法,因此,几套编码互不兼容,而且编码区间也各有不同。因为其不兼容 性,在同一个系统中同时显示 GB 和 Big5 基本上是不可能的。后来,由于各方面的原因, 国际上又制定了针对中文的统一字符集 GBK 和 GB18030,其中 GBK 已经在 Windows、Linux 等多种操作系统中被实现。GBK 兼容 GB2312,并增加了大量不常用汉字, 还加入了几乎所有的 Big5 中的繁体汉字。但是 GBK 中的繁体汉字和 Big5 中的几乎不兼容。 GB18030 相当于

13、是 GBK 的超集,比 GBK 包含的字符更多。 谈谈 Unicode 编码,简要解 释 UCS、UTF、BMP、BOM 等名词 这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不 清楚的概念,增进知识,类似于打 RPG 游戏的升级。整理这篇文章的动机是两个问题:问 题一:使用 Windows 记事本的“另存为”,可以在 GBK、Unicode、Unicode big endian 和 UTF-8 这几种编码方式间相互转换。同样是 txt 文件,Windows 是怎样识别编码方式的呢? Unicode、Unicode big endian 和 UTF-8 编码的 tx

14、t 文件的开头会多出几个字节,分别是 FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8) 。但这些标记是 基于什么标准呢?问题二: 最近在网上看到一个 ConvertUTF.c,实现了 UTF-32、UTF-16 和 UTF-8 这三种编码方式 的相互转换。对于 Unicode(UCS2)、GBK、UTF-8 这些编码方式,我原来就了解。但这个 程序让我有些糊涂,想不起来 UTF-16 和 UCS2 有什么关系。 查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些 Unicode 的细节。写成 一篇文章,送给有过类似疑问的朋友

15、。本文在写作时尽量做到通俗易懂,但要求读者知道 什么是字节,什么是十六进制。 0、big endian 和 little endianbig endian 和 little endian 是 CPU 处理多字节数的不同方式。例如“汉”字的 Unicode 编码 是 6C49。那么写到文件里时,究竟是将 6C 写在前面,还是将 49 写在前面?如果将 6C 写 在前面,就是 big endian。若是将 49 写在前面,就是 little endian。 1、字符编码、内码, 顺带介绍汉字编码字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早 期的计算机使用 7 位的

16、ASCII 编码,为了处理汉字,程序员设计了用于简体中文的 GB2312 和用于繁体中文的 big5。 从 ASCII、GB2312、GBK 到 GB18030,这些编码方 法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的 字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高 位不为 0。按照程序员的称呼,GB2312、GBK 到 GB18030 都属于双字节字符集 (DBCS)。有的中文 Windows 的缺省内码还是 GBK,可以通过 GB18030 升级包升级到 GB18030。 不过 GB18030 相对 GBK 增加的字符,普通人是很难用到的,通常我们还是用 GBK 指代 中文 Windows 内码。 在 DBCS 中,GB 内码的存储格式始终是 big endian,即高位在前。 GB2312 的两个字节的最高位都是 1。但符合这个条件的码位只有 128*128=16384 个。所以 GBK 和 GB

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号