Issuu on Google+

Xin Xi Gong Cheng Qi Kan

Scientific Journal of Information Engineering

藏文基本集和大字符集标准编码的转换实现* 马强,李永宏 西北民族大学 中国民族语言文字信息技术重点实验室,甘肃 兰州 730030 摘

要:本文对国家标准和国际标准(ISO/IEC 10646)之间的相互转换进行了详细阐述,并在 MATLAB 平台上实现了对

UNICODE 编码的操作,进行了国家标准和国际标准的编码转换,为以后在 MATLAB 平台上处理小字符集编码的藏文提供了 有效的方法。 关键词:藏文;编码;转换;MATLAB

The Realization of Tibetan Code Conversion between National and International Standards Qiang Ma, Yonghong Li Key Lab of China's National Linguistic Information Technology, Northwest University for Nationalities, Lanzhou, China, 730030 Email: lyhweiwei@126.com Abstract: The paper has expatiated the mutual conversion between national and international standards (ISO/IEC 10646), and realized UNICODE operation based on MATLAB. It has made code conversion between national and international standards, in order to prov ide an effective method for further Tibetan small-character code processing based on MATLAB. Key words: Tibetan; Code; Conversion; MATLAB

1 引言 计算机处理汉字时,在绝大多数情况下将每一个汉字作为一个独立的处理单元,并为之编码。汉字的编码一 般为等长的双字节或多字节,内码的识别机制较为简单。藏文是一种古老的拼音文字,除了进行横向拼写,可能 同时还要进行纵向拼写。藏文在计算机中的表示、存储与传输涉及藏文字符的编码问题,自藏文信息处理的研究 开始,就开始了藏文编码的研究工作。国内使用比较多的有同元藏文输入法,班智达藏文输入,桑布扎输入法, 喜马拉雅藏文输入法,央金藏文输入,琼迈藏文输入法等,不同的藏文输入法有独立的编码体系。在我国有关专 家和部门的长期努力下,国家质量技术监督局于 1997 年颁布为国家标准,标准代号为 GB16959-1997,标准名称 为《信息技术信息交换用藏文编码字符集基本集》,在技术内容上等同采用国际标准 ISO/IEC10646《藏文编码 字符集基本集》。该编码字符集与 GB13000.1 的双八位基本多文种平面的形式一致。该国际、国家标准的制订是 藏文信息处理的里程碑,标志着藏文信息处理正式走向世界。同时,藏文也就成了国内第一个具有国际标准的少 数民族文字。这种编码方式的特点是可以用尽可能少的码位,通过动态叠加组合方式得到成千上万的藏文字符, 但技术实现难度很大 [1]。2005 年电子信息产业发展基金项目专门设立了“藏文大字符集标准研究”项目,西藏语 委、西藏大学、西北民族大学、青海师范大学以及内地有关单位的专家,组成藏文信息技术国家标准编制工作 组,形成了两项国家标准:GB/T20542-2006《信息技术藏文编码字符集扩充集 A》、GB/T《信息技术藏文编码字 符集扩充集 B》。直到微软发布了新一代操作系统 vista,嵌入了基本集的藏文输入法,实现了通过动态叠加组合 方式实现藏文的显示,这也是迄今为止在全球范围内第一个全面支持藏文、蒙文、维文和彝文等若干少数民族文 字的计算机操作系统 [2]。 编码国家标准和国际标准发布较晚,并且基于国际标准小字符集编码实现藏文支持的技术相对复杂,大部分藏 *

基金项目:国家社科基金-藏语方言调查字表及辅助系统研究(09BYY059) SJIE Apr. 2012 Vol.2 No.2 PP.66-71 www.sjie.org © 2011 American V-King Scientific Publishing, LTD | 66


Xin Xi Gong Cheng Qi Kan

Scientific Journal of Information Engineering

文处理系统都没有采用统一的国际标准编码,无法在系统底层实现藏汉英兼容处理和对其他应用软件的支持,也使 得不同藏文编码的资源无法充分利用,阻碍了藏文信息化发展的进程。所以近几年有不少单位都进行了藏文编码转 换的研究,不同藏文编码方式的比较及其转换 [3],对国内主要的编码方案进行介绍,并提出了转换思想。藏文编码 转换软件“藏码通”的设计与实现 [4]实现了国内主要编码的转换 [3][4]。 MATLAB 语言广泛应用于工程计算及数值分析领域,集成了计算,可视化和编程于一个易用的环境中,是国 际公认的最优秀的工程应用开发环境。本文主要解决了藏文 UNICODE 编码在 MATLAB 平台上的操作问题,并实 现了国家标准和国际标准的编码转换,为以后在 MATLAB 平台上处理小字符集 UNICODE 编码的藏文提供了有效 的方法。

2 基本概念 2.1 基本集 《信息交换用藏文编码字符集》国际标准(《信息技术信息交换用藏文编码字符集基本集》国家标准)规定 了藏文基本字符的集合及其编码表示,在 ISO/IEC10646 的基本平面中分配给藏文 195(0F00-0FCF)编码位, (它含 192 个编码点,169 个编码字符)。藏文基本字母与组合用字符构成内码复合序列,按规则迭加生成藏文字 丁,即一个藏文字丁对应多个 Unicode 编码。整个编码表分为藏文符号、藏文数码、藏文及梵音藏文字母、藏文 组合用字符、控制符五大部分。其中藏文符号分为:标点符号类、天文历算符号类、特殊符号类。

2.2 扩充集 国家标准《藏文编码字符扩充集 A》(Extension set A)由基本字符纵向叠加而成的结构稳定的藏文字符和最 常用梵音转写字符的集合,属于大丁字符集,占用 ISO10646 基本多文种平面的专用用户区,编码空间为 F300F8FF,共有 1536 个垂直预组合字符,对现代藏文文献的覆盖率达到 100%,包括:1)现代藏文(三次厘定后的 藏文书写形式)、古藏文(规范之前藏文书写形式)和已成为藏文部分的梵音转写藏文字符,计 962 个; 2)最 常用的梵音转写藏文字符,计 574 个。 《藏文编码字符扩充集 B》(Extension set B)以西藏收集的大字符集、藏学中心提供的梵音转写藏文字符和 其他佛教经典中出现的梵音转写藏文字符为主要依据,包括其余的垂直预组合梵文字符,计 5669 个,占 用 ISO/IEC 10646 的 0F 辅 助 平 面 , 码 位 为 00F0000~000F1645。 符 合 藏 文 国 家 大 字 符 集 标 准 的 编 码 有 不 丹 的 Jomolhari 字体、西北民族大学的 TibetBtA 等,国内其他研究单位也陆续推出了符合藏文扩 A 标准的字体和输入 法。基本集、扩充集 A 和扩充集 B 能表示所有现代藏文和 99.99%古藏文,能够满足藏文信息处理的需要[5]。 表 1 扩充集 A 与基本集编码对照表 序号

扩 A 编码

1

编码

基本集字符

F300

0F68,0F72

+

2

F301

0F68,0F80

+

3

F302

0F68,0F74

+

4

F303

0F68,0F7A

+

5

F304

0F68,0F7C

+

10

F309

0F40,0F7A

+

50

F331

0F66,0F90,0F72

+ +

字符

67 | SJIE Apr. 2012 Vol.2 No.2 PP.66-71 www.sjie.org © 2011 American V-King Scientific Publishing, LTD


Xin Xi Gong Cheng Qi Kan

Scientific Journal of Information Engineering

3 转换方法 3.1 扩 A-基本集转换 藏文国家标准扩充集 A 加 TrueType 字体技术可实现垂直预组合方案,即利用“预组合”(Pre-composed)把 二维的字符流化作一维字符流处理。采用大字符集编码(国家标准),由于编码与字库中的字符一一对应,只需 制作 TrueType 字库即可,扩充集 A 大约有 1500 多个藏文字丁。国家标准扩充集 A 与国际编码基本集的对应关系 如表 1 所示。 表格中

是由

和 两个基本集字符组成,在预组合字符中(扩 A),只有一个编码 F300,而转换成标准字

符集之后是由两个编码组成,即 0F68 和 0F72。 从平面的扩 A 到线性的基本集转换,也就是一个字丁分解成部件的一个过程,比较简单,程序流程见图 1。

图 1 藏文扩 A 编码-基本集编码转换流程图

转换步骤如下: (1)顺序读入待转换的文本,取出每一个字丁的扩 A 内码值。 (2)查找藏文扩 A 与基本集编码对照表(见表 1),找到分解成基本集的码值。 (3)然后把每个基本集编码,转换成对应的字符。转换表中没有的,不用转换。 (4)回到步骤 1 处理下一个藏文字丁。

3.2 基本集–扩 A 转换 以基本集为编码序列的藏文文本,是线性的基本码复合序列,38 个藏文基本字母(非组合性字符)是复合序 列(相当于一个字丁编码)的先导,标志着一个复合序列的结束,后一个复合序列的开始。当一个藏文字丁由一 个藏文基本字母与多重组合用字符组成时,各组合用字符均相对于藏文非组合字母定位 ,以藏文基本字母为基 准,在该基本字母下面的组合用字符按向下的顺序排列,上面的组合用字符按向上的顺序排列,编码顺序为:非 组合性字符-下加组合性字符-上加组合性字符。例如 的编码为:0F66( )0F90( )0F7C(

)。

SJIE Apr. 2012 Vol.2 No.2 PP.66-71 www.sjie.org © 2011 American V-King Scientific Publishing, LTD | 68


Scientific Journal of Information Engineering

Xin Xi Gong Cheng Qi Kan

基本集编码的藏文转换成扩 A 编码的藏文,转换步骤如下: (1)先找音节点,以音节点为界,音节点之间的为一个藏字(音节)的线性序列码,码值根据表 1 得到。 (2)对藏字的线性序列码以基本字母集分界,每个基本字母之间的序列码对应扩 A 的一个字丁码。 (3)查找编码对照表得出这个藏字的所有扩 A 字丁码。 (4)处理下一个藏字,回到步骤 2,直到所有藏字处理完毕。

4 程序实现 4.1 文件的读入 读入待转换的文件,可以是 txt 文本文件和 xls 文件,txt 文件需要用 MATLAB 的低级函数 fopen () 以 UCS2 编 码方式打开,利用 fread() 函数以 char' 方式读入字符,并用 abs() 函数转换成 10 进制编码。xls 文件直接用高级函 数 xlsread() 以元组形式读入字符,并同样用 abs() 函数转换成 10 进制编码。 (1)读入 txt 文本文件 fid = fopen(filename1, 'r', 'n', ' UCS2');%以 UCS2 编码方式打开文件 code_dec=abs(fread(fid, '*char')');%以 char 形式读取文件内容,保存编码到变量 code_dec 中 (2)读入 xls 文件 [num,txt,tibetan1] = xlsread(filename1);%把文件的内容以元组的形式读到变量 tibetan1 中 [word_num1,field_num1]=size(tibetan1); code_dec=abs(tibetan1); %保存编码到变量 code_dec 中

4.2 扩 A-基本集转换 取出待转换文件的每一个编码 code_hex,查找转换码表 txt,取出对应所有小字符集编码,保存到 code 中, 利用 char()函数将编码转换为字符串。 kk=0; %编码序号初始值为 0 for ii=1:code_num if strcmp(code_hex(ii),'0F0B') %判断编码是否为音节点编码 kk=kk+1; %编码序号加 1 code(kk)={'0F0B'};%音节点 else gg=strmatch(code_hex(ii),txt(:,2),'exact');%取出字丁编码和码表第 2 列进行精确匹配,并返回位置 if gg>0 %匹配成功 for jj=3:8 %取出第 3 列到第 8 列的所有编码 kk=kk+1; %编码序号加 1 code(kk)=txt(gg,jj); %复制编码表中的编码到 code 中 end else %匹配不成功 kk=kk+1; %编码序号加 1 code(kk)=code_hex(ii);%直接复制扩 A 编码到 code 中,一般都是两者的共有编码 end end end 69 | SJIE Apr. 2012 Vol.2 No.2 PP.66-71 www.sjie.org © 2011 American V-King Scientific Publishing, LTD


Xin Xi Gong Cheng Qi Kan

Scientific Journal of Information Engineering

result = char(hex2dec(code));% 编码转换为字符串

4.3 基本集–扩 A 转换 基本集是对每一个部件进行编码,取出待转换文件的每一个编码 code_hex,判断字符是否是组合型字符,从 而准确的判断出每一个字丁的编码,再查找编码对照表,即可找到对应的大字符集的字丁编码。 position=find(code);%音节点位置 如果编码是非组合字符,如果下一个字符还是非组合字符,则前一个字符为前加字,至到下一个非组合字符 为后加字,uncombine 为非组合字符编码,upcombine 为上加组合字符,downcombine 为下加组合字符 uncombine=strvcat('0F40','0F41','0F42','0F44','0F45','0F46','0F47','0F49','0F4A','0F4B','0F4C','0F4E','0F4F', ... '0F50','0F51','0F53','0F54','0F55','0F56','0F58','0F59','0F5A','0F5B','0F5D','0F5E','0F5F',... '0F60','0F61','0F62','0F63','0F64','0F65','0F66','0F67','0F68','0F6A','0F88','0F89'); upcombine=strvcat('0F39','0F7B','0F7E','0F72','0F7C','0F80','0F7A','0F7D','0F83'); downcombine=strvcat('0F71','0F9B','0FAA','0F74','0F9C','0FAB','0F84','0F9E','0FAD','0F90','0F9F','0FB1',... '0F91','0FA0','0FB2','0F92','0FA1','0FB3','0F94','0FA3','0FB4','0F95','0FA4','0FB5',... '0F96','0FA5','0FB6','0F97','0FA6','0FB7','0F99','0FA8','0FBB','0F9A','0FA9','0FBC'); kk=0; %kk 为字丁个数,也就是非组合字符编码个数 for ii=1:code_num if strcmp(code_hex(ii),'0F0B') kk=kk+1; code(kk)={'0F0B'};%音节点 elseif strmatch(code_hex(ii),uncombine,'exact');% code_hex(ii)属于非组合字符 kk=kk+1; code(kk)=code_hex(ii);%直接拷贝编码,保存到 code 中 else % code_hex(ii)属于组合性字符 code(kk)={strcat(code{kk},code_hex{ii})};%与前字符编码组合后,保存到 code 中 end end txt2=strcat(txt(:,3),txt(:,4),txt(:,5),txt(:,6),txt(:,7),txt(:,8));%编码对应表中第 3 列到第 8 列合并 result=''; for ii=1:kk jj=strmatch(code(ii),txt2,'exact');%编码精确匹配 if jj>0 %匹配成功 code_ka(ii)=txt(jj,2);%取第 2 列编码复制到 code_ka 中 else %匹配不成功 code_ka(ii)=code(ii);% 直接复制编码到 code_ka 中,一般都是两者的共有编码 end code_ka_dec(ii)=hex2dec(code_ka(ii)); %转换 16 进制编码为 10 进制编码 result=strcat(result,char(code_ka_dec(ii))); %转换 10 进制编码为字符串,并进行字符串连接 end result2={result}; SJIE Apr. 2012 Vol.2 No.2 PP.66-71 www.sjie.org © 2011 American V-King Scientific Publishing, LTD | 70


Xin Xi Gong Cheng Qi Kan

Scientific Journal of Information Engineering 4.4 文件的输出

编码转换完毕,文件的输出也需要考虑保存方式,保存为 txt 时,以 UTF-8 编码方式进行输出,以 xls 文件保 存时,直接调用高级命令函数 xlswrite()即可。 (1)输出 txt 文件 fid = fopen(filename3, 'w', 'n', 'UTF-8');%以 UTF-8 编码方式打开文件 filename3 fwrite(fid, result', 'char');%以 char 的形式往文件 filename3 中写结果 (2)输出 xls 文件 xlswrite(filename3,result2); 直接写把 result2 写入 filename3 中 end

5 结语 随着 windows vista 的普及和 unicode 的不断盛行,众多藏文文字处理软件必被微软藏文输入法所取代,小字 符集的编码系统已经成文主流。本文主要对国家标准码(GB18030)和国际标准码(ISO/IEC 10646)的编码方式 进行介绍,建立对应码表,并在 MATLAB 平台上实现了对 UNICODE 码的操作,解决了这两种编码的转换问题。 MATLAB 源码开放,简单易学,便于教学和技术交流,文本处理功能强大,有效进行了 MATLAB 藏文文本处理 程序的开发,能够让更多的研究人员了解藏文、加入到藏文信息处理的行列,进行专业人才的培养,推动民族语 言的信息化进程。 参考文献 [1] 于洪志. 藏文内码扩展体系[J]. 中文信息学报, 1999.1. [2] 高定国. 回顾藏文信息处理技术的发展[J]. 西藏大学学报(社会科学版), 2009.3. [3] 李永宏, 何向真, 艾金勇, 等. 不同藏文编码方式的比较及其转换[J]. 计算机应用, 2009.7. [4] 刘汇丹, 诺明花, 赵维纳, 等. 藏文编码转换软件“藏码通”的设计与实现. 《少数民族青年自然语言处理技术研究与进展——第三 届全国少数民族青年自然语言信息处理、第二届全国多语言知识库建设联合学���研讨会论文集》, 2010. [5] 陈壮, 代红. 藏文大字符集编码标准研究[J]. 信息技术与标准化, 2007.8.

【作者简介】 马强(1980-),男,回族,讲师,硕士,计算机网络,中文多文种信息处理。1999 年 9 月至 2003 年 6 月就读于西北民族大学数学系计算机科学技术与应用专业;2008 年 9 月-2011 年 6 月就 读于西北民族大学中国民族信息技术研究院中国少数民族语言文学专业。

71 | SJIE Apr. 2012 Vol.2 No.2 PP.66-71 www.sjie.org © 2011 American V-King Scientific Publishing, LTD


The Realization of Tibetan Code Conversion between National and International Standards