适于数字地图的汉字编码转换方法

2015-04-20 02:43胡群英符浩军魏彩虹
测绘科学与工程 2015年4期
关键词:数字地图生僻字字符

胡群英,符浩军,魏彩虹

测绘信息技术总站,陕西 西安,710054



适于数字地图的汉字编码转换方法

胡群英,符浩军,魏彩虹

测绘信息技术总站,陕西 西安,710054

数字地图中的文字注记作为地图语言的组成部分,在弥补地图符号不足、地图信息传输等方面重要作用。基于计算机汉字处理的特点,本文以地图中的常见字和生僻字为研究对象,提出了一种数字地图文件中汉字编码模式的自动分析方法和高效字符编码转换算法,研制了一种数字地图文字编码转换软件,从而有效地解决了测绘保障工作中非国标中文编码、生僻字编码等数字地图系统的运行显示问题,并在实际的数字地图分析、显示和应用工作中发挥了重要作用。

数字地图;汉字编码;编码转换;方法研究

1 引 言

测绘保障工作经常需要使用多种数字地图作为分析的基本资料,实际应用中,由于数字地图来源的多样性,地图数据采用的文字编码也多种多样,并且地图数据经常存在一定数量的生僻字和特殊字符,而这类文字由于没有标准字符编码,无法通过计算机系统自身的字库和输入法进行汉字的输入和存储,上述情况使得不少地图数据的文字注记无法正常显示[1]。为了解决上述问题,本文探讨了以文本形式存储数字地图的文字内容时,文字不同字符编码的转换问题。通过分析和识别字符编码,设计生僻字编码,建立汉字编码对照表,提出了高效的字符编码转换算法,实现了一套数字地图文字编码转换软件。该软件将数字地图文件中不同字符编码的文本文件,转换为操作系统下可以正确运行与显示的地图数据文件。

2 汉字编码标准

为了使汉字在计算机系统中有统一的代码,我国颁布了汉字编码国家标准GB2312-80《信息交换用汉字编码字符集基本集》[2]、GBK《汉字内码扩展规范》[3]、GB18030-2000《信息交换用汉字编码字符集基本集的扩充》等。我国台湾地区实行的汉字编码字符集是BIG5。

2.1 GB2312字符集

GB2312-80是一个简化字的编码规范,由国家标准总局发布,于1981年5月实施,通行于我国大陆地区以及新加坡等地。它包括汉字、符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。GB2312所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。

GB2312-80规定,对任意一个图形字符都采用两个字节表示,每个字节均采用八位编码表示。习惯上称第一个字节为“高字节”,第二个字节为“低字节”,而每个字节的最高位为“1”。因此,GB2312-80中汉字的编码范围为:第一字节0xB0至0xF7,对应十进制为176至247;第二个字节0xA0至0xFE,对应十进制为160至254。

2.2 BIG5字符集

BIG5编码是中文繁体字编码,于1984年由台湾财团法人信息工业策进会和五家软件公司宏碁(Acer)、神通(MiTAC)、佳佳、零壹(Zero One)、大众(FIC)创立,故称大五码,主要在我国台湾地区和香港地区使用,它包含了420个符号和13070个汉字。

BIG5汉字编码中,每个汉字由两个字节构成。第一个字节的编码范围从0x81至0xFE,即十进制的129至255,共126种;第二个字节的编码范围由两段组成,不连续,分别为0x40至0x7E和0xA1至0xFE,即十进制的64至126和十进制的161至254,共157种。因此,其第一字节的最高位是1,第二字节的最高位则可能是1、也可能是0。尽管BIG5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科用字,没有包含日文平假名及片假名字母。

2.3 GBK字符集

GBK由国家信息技术标准化技术委员会于1995年12月制定,共有20902个汉字。GBK编码中汉字分为两类:一类是简体字,即原来GB码中的汉字,通常称为GBK简体;另一类是繁体字,即原来BIG5码中的汉字,通常称为GBK繁体。因此,GB2312中的汉字编码与GBK中的简体汉字相同。GBK中每个汉字仍然包含两个字节,第一个字节的编码范围是0x81至0xFE,即十进制的129至254;第二个字节的编码范围是0x40至0xFE,即十进制的64至254。GBK向下兼容GB2312,向上支持ISO 10646.1国际标准。不规范理解为GB即GBK简体。

显然,繁体不等同于BIG5。GBK集中有繁体,GB12345集也有繁体,但这三者的汉字编码方式不同。Windows95/98/NT/2000/XP(简体)都使用GBK字符集。

2.4 GB18030字符集

GB 18030全称为GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,我国于2000年3月发布,2001年8月后在中国市场上发布的软件必须符合此标准。GB18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题,其字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求,并且与以前的国家字符编码标准兼容。

GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0x00至0x7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0x81至0xFE,尾字节码位分别是0x40至0x7E和0x80至0×FE。四字节部分采用GB/T 11383未采用的0x30至0x39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0x81308130至0xFE39FE39。其中,第一、三个字节编码码位均为0x81至0xFE,第二、四个字节编码码位均为0x30至0x39。

3 生僻汉字库建立与编码

上述汉字编码字符集涵盖了常见的汉字,但对于地方字、异形字等生僻字则在上述编码字符集中无法找到。考虑到地图数据中可能存在的生僻字,需要针对此情况进行单独设计。具体如下:首先把数据中出现的所有生僻字进行汇总,然后按照一定的顺序给每个生僻字配一个以字母和数字组合的编码,如A001。在数据中就用编码来代替这些生僻字,同时建立生僻字库,将需要用到的生僻字对一一对应到相应的编码中。此编码应与已有的编码相异,且编码规则按照常见字编码规则进行设计和考虑。为达到生僻字与编码一一对应的目的,经过研究后发现,只要扩充现有的标准字库,制作一个1∶50 000 基础地理信息数据专用生僻字库,就可以达到地图中生僻字与编码一一对应的目标。生僻字库的具体制作流程如图1所示:

图1 生僻字库制作流程

此时,这个生僻字库只是一个独立的字库,还不能与标准字库一起使用。因此,需要把这个生僻字库中的字追加到我们的标准字库中,使之成为一个扩充的标准字库。这样,生僻字库中的字就可以像那些常用字一样为用户所使用。

4 中文字符编码系统转换算法

编码转换的实现需要解决以下五个问题:首先,需要确定待转换文件中是否包含汉字编码字符;其次,如果检测到转换文件包含汉字编码,则需要确定文件中汉字的编码标准;第三,依据文件的汉字编码标准,使用编码转换算法将源文件汉字编码转换为所需要的汉字编码,同时确保文件中的非汉字字节不能有任何变化;第四,确定文件中的汉字是否为生僻字,若是,则建立生僻字编码对照表,将源文件生僻字编码转换为所需要的汉字编码;最后,考虑到数字地图通常会包含大量的数据文件,因此汉字转换算法需要有较高的算法效率。

4.1 汉字编码标准的确定

对文件中的汉字编码进行转换,首先需要判断文件中是否包含中文编码字符。因为需要转换的仅仅是中文字符,文件中的任何非中文字节必须保持。

中文字符具有两个显著的特点:第一,西文字符,例如ASCII码,用一个字节来表示,而中文字符用两个字节来表示;第二,西文字符编码范围是0至127,而中文字符编码中至少有一个字节是128至255。

对于一个文本文件,除了中西文字符之外,还有回车、换行等控制字符。尽管这些控制字符在打印和显示时不可见,但是其编码也是一个字节,且小于128。

如果我们用fstByte表示文件中相邻两个字节的第一字节,用sndByte表示第二字节。对于纯文本文件,则可以通过下述算法确定文件中是否包含汉字以及汉字的编码标准。

(1)如果第一字节fstByte和第二字节sndByte满足:

① fstByte>=0x81并且fstByte<=0xfe;

② sndByte>=0x40并且sndByte<=0xfe;

则该文件包含中文字符,且中文字符采用了GBK编码。

(2)如果第一字节fstByte和第二字节sndByte满足:

① fstByte>=0xb0并且fstByte<=0xf7;

② sndByte >=0xa0 并且sndByte <=0xfe;

则该文件包含中文字符,且中文字符采用了GB2312编码。

(3) 如果第一字节fstByte和第二字节sndByte满足:

① fstByte>=0x81并且fstByte<=0xfe;

② sndByte >=0x40并且sndByte<=0x7e;

或者

sndByte >=0xa1并且sndByte <=0xfe;

则该文件包含中文字符,且中文字符采用了BIG5编码。

(4) 不满足上述条件的字节作为非中文单字节处理。

使用上述算法时,隐含了一个基本约束条件:同一个文件中,所有中文字符均采用同一种中文字符编码。在实际的数字地图文件中,这一基本约束能够得到满足。因此,可以利用这个基本约束来校验和确认判定结果。

通过上述算法,既可以自动确定每一个文件是否包含中文字符,又能够同时确定字符的编码标准。

4.2 汉字编码查找表

中文字符根据其给定的编码存放于编码表中。显式表达的汉字编码通常是编码矩阵表。图2给出了GB2312-80编码表的例子;图3给出了GBK编码表的例子;图4给出了生僻字编码表的例子。

图2 GB2312 编码表(部分)

图3 GBK编码表(部分)

图4 生僻字编码表(部分)

在计算机中,我们采用线性查找表存储汉字编码表,以方便编码转换。在线性表中,字符的存储位置与其编码具有一定的关系,其汉字编码在线性查找表的位置按下述公式计算:

假设输入的两字节汉字编码的第一字节是B1、第二字节是B2。对于GB2312编码查找表TGB,该字符在TGB中的起始位置P是:

P(TGB)=2*((B1-176)*94+B2-161)

(1)

对于GBK编码查找表TGBK,该字符在TGBK中的起始位置P是:

P(TGBK)=2*((B1-129)*191+B2-64)

(2)

对于BIG5编码查找表TBIG5,该字符在TBIG5中的起始位置P是:

P(TBIG5)=2*((B1-161)*157+B2-64)

(3)

对于生僻字这类编码,由于已将生僻字库追加到标准字库中,因此可直接在标准字库中采用顺序查找的方法获取生僻字对应的编码。

4.3 汉字编码转换

不同的汉字编码之间具有确定的对应关系,两种汉字编码之间的转换依赖于这种编码定义。因此,最简单的编码转换就是建立两类编码的对照表,通过查找编码对照表实现编码转换。例如,对于从BIG5到GBK的汉字编码转换,可以在BIG5编码查找表位置给出BIG5相应汉字的GBK编码以构成编码对照表;也可以在GBK编码查找表位置给出GBK相应汉字的BIG5编码以构成编码对照表;对于生僻字,从生僻字编码表中对照转换,并在汉字编码转换中保持不变。下面以BIG5编码转换为GBK码为例,给出编码转换的具体算法实例。

假设CvTable是BIG5码至GBK码的编码对照表,编码转换算法步骤是:

①打开源文件;

②从文件中读取一个字节S1stByte;

③如果(S1stByte>=0x81)并且(S1stByte<=0xfe),则

{

④读取文件下一个字节S2ndByte;

⑤ 如果文件结束,则将S1stByte写入目标文件,转步骤⑥;否则

{

如果S2ndByte>=0x40并且S2ndByte<=0x7e或者S2ndByte>=0xa1并且S2ndByte<=0xfe,则按公式(2)计算BIG5字符在GBK查找表中的位置P,在CvTable中按照位置P顺序读取两个字节并依次写入目标文件;否则将S1stByte写入目标文件,将S2ndByte赋值到S1stByte,然后转步骤③;

}

}

否则,将S1stByte写入目标文件,转步骤②;

⑥ 算法结束。

5 编码转换系统实现

我们在windows操作系统下使用C++语言实现了本文的算法设计,并在实际工作中通过对数字地图文件的转换应用,对算法的可靠性及算法效率进行了验证。

5.1 编码转换过程

汉字编码的转换过程:①源文件的载入;②文件编码格式分析与确认,即对文件中汉字所采用的编码进行识别判定;③转换对照表加载,即根据文件所采用的汉字编码进行加载,对于常见字直接加载相应标准的编码表,对于生僻字则加载依据本文方法所建立的生僻字编码表;④汉字编码转换;⑤转换后目标文件输出。

5.2 交互设计

界面设计采用缺省和用户自定义设置两种方式。缺省设置下,将需要转换的源文件拖入“源文件列表”后系统自动开始文件转换,转换后的文件目录与源文件目录相同,文件名为源文件名前添加一个缺省前缀,也可以不使用文件拖放及自动文件转换,界面设置了通过点击按钮开始文件转换过程的使用方式。用户自定义设置可以自主设定目标文件前缀、目标文件目录等。文件前缀和文件目录可以通过键盘输入,也可以通过拖入文件自动获取[4,5]。

5.3 算法效率分析

(1)时间效率

算法运行时间包括读文件时间、判定每个字节的时间和字符转换的时间。文件读写时间取决于操作系统实现,本文不作探讨。

假设文件长度是n个字节,其中,中文字符共有m个。因此,中文字符所占的字节数为2m个,非中文字符数量是n-2m个。从算法描述可知,每个字节需要做两次比较,每个中文字符需要做三次加法和两次乘法以获得查找表地址,并通过两次赋值获得变换后的中文编码。由于编码只有一个字节,所以,两次乘法相当于6次加法。即上述计算相当于11次加法运算。因此,该算法的时间效率可以表示为:

v=2*n+11*m

(4)

当文件中没有中文字符时

v=2*n

(5)

当文件中只有中文字符时:

v=15*m<8*n

(6)

可见,算法的时间效率是O(n),即算法具有最优的线性时间效率,运行所需要时间与文件长度成正比[5]。

(2)空间效率

考虑到算法对文件的上下文相关性仅涉及相邻两个字符,从理论上讲,算法的空间效率可以做到仅仅两个字节。但从文件读写效率方面考虑,可以使用与文件系统数据块大小相同的读写缓冲内存。比如,对于windows操作系统,磁盘文件数据分块大小通常可设定为4k。因此,无论数据文件大小,算法的空间效率是一个很小的恒定常数。

6 结 论

本文通过分析汉字字符编码特点,以常用字和生僻字为对象,建立生僻字库并对其进行编码,将其追加到标准子库中。在此基础上,设计了一种文本文件的汉字编码自动识别方法和基于查找表的编码转换方法。通过算法分析和实验验证表明,该方法可以实现一个高效、可靠的汉字字符转换,且涵盖了常见字和生僻字,适合于较大规模数字地图文件系统的汉字字符转换,较好地解决了数字地图中的汉字尤其是生僻字的存储和显示等问题。

[1]胡群英,王金霞,方丽.中文字库及其在测绘生产中的应用分析[J].信息技术与标准化,2009(4):P50-52.

[2]王绪龙.汉字信息处理概说[M] . 南京:南京大学出版社,1988.

[3]孟祥旭,李学庆.人机交互技术原理与应用[M] .北京:清华大学出版社,2004.

[4]董士海,王衡.人机交互[M]. 北京:北京大学出版社,2004.

[5]Alan Dix, Janet Finlay, Human-Computer Interaction, Third Edition[M]. Pearson Education Limited, 2006.

Chinese Characters Encoding Conversion Applicable to Digital Map

Hu Qunying,Fu Haojun,Wei Caihong

Technical Division of Surveying and Mapping,Xi’an 710054,China

As a part of cartographic language, character lettering in the digital map plays a more important role in making up the shortage of map symbols and transmission of map information. Based on the characteristics of Chinese processing, this paper proposes an automatic analysis method for the Chinese encoding model and an efficient code conversion algorithm in digital map files using regular-used and rarely-used Chinese characters as the study object. Besides, the paper develops a character encoding conversion software of digital map. Thus it effectively solves the problems of operation and presentation in the digital map system. This method plays an important role in the actual digital map analysis, display and applications.

digital map; Chinese character encoding; code conversion; method study

2015-02-02。

胡群英(1964—),女,高级工程师,主要从事地图制图学与地理信息工程方面的研究。

P208

A

猜你喜欢
数字地图生僻字字符
生僻字里识青铜
让语文老师也会怀疑人生的生僻字
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
数字地图在绿化市容行业中的应用分析
HBM电子称与西门子S7-200系列PLC自由口通讯
挑战动物生僻字
对车辆自定位特征的评估
扒一扒“爱加戏”的生僻字