论文部分内容阅读
摘要:提出了自动计算汉字对应声母编码的概念,分析了基于汉字ASCII码和汉字字符编码国标GB2312-80规则的具体实现思路及算法,并介绍了实现该算法的主要程序段。
关键词:数据字典;中文信息处理;声母检索;ASCII码
中图法分类号:TP311文献标识码:A 文章编号:1009-3044(2007)15-30803-02
The Method Of Realizing Automatic Calculating The Corresponding Initial Consonant Of Chinese Character
ZHU Kai-mei,TAN Peng
(Institute of Science & Technical Information of Yunnan, Kunming 650051, China)
Abstract:Have brought forward the concept of calculating the corresponding initial consonant of Chinese character voluntarily , have analysed the realizing thought and algorithm based on the Chinese character ASCII code and the Chinese character code national standard GB2312-80 regulation, have introduced main program section of realizing the algorithm.
Key words:Data dictionary;Chinese information processing;Search of initial consonant;ASCII code
1 引言
应用系统中涉及大量数据字典的检索问题,数据字典检索一般方式包括:按编码检索、按汉字检索、按汉字拼音声母检索和直接列表选择等方式。其中,按汉字拼音声母进行检索具有易用、方便的特点,与使用编码检索方式比较具有易记忆的优点,与使用汉字检索方式比较具有输入简单、方便、快捷的优点,是一种符合汉语使用习惯的较综合性、折中的字典检索方式。要使用汉字拼音声母进行字典检索,关键问题是需要在建立数据字典时,根据用户输入的中文信息自动计算出对应的声母,即自动进行汉字对应声母的编码,以透明的方式提供这一转换过程。
2 实现思路
2.1计算汉字的ASCII码
汉字字符在操作环境下是以Unicode双字节编码方式存在,每个汉字字符对应一个整数,在C# 中已经没有直接计算汉字ASCII码的函数,需要通过利用Encoding类的GetBytes进行间接计算:如下:
Byte[] b=Encoding.Default.GetBytes(“啊”)
b[0]: 176
b[1]: 161
int i=b[0]*256+b[1]-65536
2.2根据汉字字符编码国标GB2312-80规则确定ASCII码对应的声母
GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。
一级字计算根据汉字ASCII码值可以方便地计算出来:其中
声母A对应ASCII码范围是:-20319至-20284
声母B对应ASCII码范围是:-19775 至-19219
……
声母Z对应ASCII码范围是:-11055 至-10247
二级字计算通过编码为固定的声母字符串,当汉字ASCII码值>-10079时,通过对应字符串获取。
3 实现方法
3.1 定义
引用命名空间:System.Text
定义类:Encoding
自定义方法:
(1)计算字符ASCII值函数:Asc
参数:pStr, 字符串型
返回值:Int,字符的ASC码
(2)计算汉字声母函数:Hzpy
参数:pStr,字符串型
返回值:String, 转换后的汉字声母字符串
3.2 算法流程图
3.3 算法描述
(1)判断输入参数字符串是否为空,若为空,则结束。
(2)初始化局部变量。
(3)使用For循环,逐字符进行计算。
(4)利用Asc函数计算当前字符的ASCII码。
(5)根据ASCII值分别计算字符的声母,其中:ASCII值在-10247到-20319,属于一级字库,按拼音顺序排列,可以通过判定值直接得到声母;ASCII值大于0,则取字母“A”到“Z”;ASCII值在0到-10079之间,则从预定义的声母表中获取。
3.4 主要程序段
//计算字符串首字符的ASCII码值
public int Asc(string pStr)
{ int _i=0;
if (pStr.Length > 0)
{ string _s = pStr.Substring (0,1);//取首字符
byte[] _b = System.Text.Encoding.Default.GetBytes (_s); //计算字符的Unicode码
if (_b.Length == 1)
_i = _b[0]; //西文ASCII
else
_i = _b[0]*256+_b[1]-65536; //汉字ASCII-65536 }
return _i; }
//计算字符串对应的声母
public string Hzpy(string pStr)
{ if (pStr.Length == 0){ return "" ;}//参数是空串
string sResult = ""; //定义返回字符串变量
int t; //字符的Ascii码
string gH0="";
gH0 = InputAscii2();//从文件中加载二级字库汉字声母表
pStr = pStr.ToUpper ();
for (int i = 0 ; i < pStr.Length; i++)
{ t = Asc(pStr.Substring (i, 1));
if (t < 0)
{ if ( t >= -10079) //计算二级字库汉字声母
if (gH0.Length > 10079+t)
sResult = sResult + gH0.Substring (10079 + t,1);
else
sResult = sResult + " ";
else //计算一级字库汉字声母
{ if (t>=-20319 && t<=-20284) sResult = sResult + "A";
else if (t>=-20283 && t<=-19776) sResult = sResult + "B";
else if (t>=-19775 && t<=-19219) sResult = sResult + "C";
else if (t>=-19218 && t<=-18711) sResult = sResult + "D";
else if (t>=-18710 && t<=-18527) sResult = sResult + "E";
else if (t>=-18526 && t<=-18240) sResult = sResult + "F";
else if (t>=-18239 && t<=-17923) sResult = sResult + "G";
else if (t>=-17922 && t<=-17418) sResult = sResult + "H";
else if (t>=-17417 && t<=-16475) sResult = sResult + "J";
else if (t>=-16474 && t<=-16213) sResult = sResult + "K";
else if (t>=-16212 && t<=-15641) sResult = sResult + "L";
else if (t>=-15640 && t<=-15166) sResult = sResult + "M";
else if (t>=-15165 && t<=-14923) sResult = sResult + "N";
else if (t>=-14922 && t<=-14915) sResult = sResult + "O";
else if (t>=-14914 && t<=-14631) sResult = sResult + "P";
else if (t>=-14630 && t<=-14150) sResult = sResult + "Q";
else if (t>=-14149 && t<=-14091) sResult = sResult + "R";
else if (t>=-14090 && t<=-13319) sResult = sResult + "S";
else if (t>=-13318 && t<=-12839) sResult = sResult + "T";
else if (t>=-12838 && t<=-12557) sResult = sResult + "W";
else if (t>=-12556 && t<=-12081) sResult = sResult + "X";
else if (t==-12080) sResult = sResult + "H";
else if (t>=-12079 && t<=-11848) sResult = sResult + "X";
else if (t>=-11847 && t<=-11056) sResult = sResult + "Y";
else if (t>=-11055 && t<=-10247) sResult = sResult + "Z";
}}
else //字母和数字
{ if (t>=65 && t<=90|| t>=48 && t<=57)
sResult = sResult + pStr.Substring (i, 1); } }
return sResult; }
4 实现结果
输入:Hzpy(“ab”) , 输出:“AB“
输入:Hzpy(“我们”),输出:“WM”
输入:Hzpy(“驽一孥”),输出:“NYN”
5 小结
通过这种方法计算汉字对应声母,其中一级字库近7000个汉字,只需要通过条件判断语句即可计算出来,二级字库3000多个汉字通过预编码,直接一一对应产生。与过去通过一个汉字对应一个字符的方式相比,这种方法不需要专门的数据文件进行存储,不仅大大提高了计算速度,而且十分容易在不同的开发语言中进行移植,具有非常显著的实用性。
参考文献:
[1]规范. GB2312-80《信息交换用汉字编码字符集 基本集》[S]. 北京: 中国标准出版,2003。
[2]葛季栋等. 利用数据字典创建维护数据库基表[J]. 北京: 微型机与应用,2002。
[3]美Jason Price Mike Gunderloy.《Visual C#.NET 从入门到精通》[M]. 北京: 电子工业出版社,2003。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:数据字典;中文信息处理;声母检索;ASCII码
中图法分类号:TP311文献标识码:A 文章编号:1009-3044(2007)15-30803-02
The Method Of Realizing Automatic Calculating The Corresponding Initial Consonant Of Chinese Character
ZHU Kai-mei,TAN Peng
(Institute of Science & Technical Information of Yunnan, Kunming 650051, China)
Abstract:Have brought forward the concept of calculating the corresponding initial consonant of Chinese character voluntarily , have analysed the realizing thought and algorithm based on the Chinese character ASCII code and the Chinese character code national standard GB2312-80 regulation, have introduced main program section of realizing the algorithm.
Key words:Data dictionary;Chinese information processing;Search of initial consonant;ASCII code
1 引言
应用系统中涉及大量数据字典的检索问题,数据字典检索一般方式包括:按编码检索、按汉字检索、按汉字拼音声母检索和直接列表选择等方式。其中,按汉字拼音声母进行检索具有易用、方便的特点,与使用编码检索方式比较具有易记忆的优点,与使用汉字检索方式比较具有输入简单、方便、快捷的优点,是一种符合汉语使用习惯的较综合性、折中的字典检索方式。要使用汉字拼音声母进行字典检索,关键问题是需要在建立数据字典时,根据用户输入的中文信息自动计算出对应的声母,即自动进行汉字对应声母的编码,以透明的方式提供这一转换过程。
2 实现思路
2.1计算汉字的ASCII码
汉字字符在操作环境下是以Unicode双字节编码方式存在,每个汉字字符对应一个整数,在C# 中已经没有直接计算汉字ASCII码的函数,需要通过利用Encoding类的GetBytes进行间接计算:如下:
Byte[] b=Encoding.Default.GetBytes(“啊”)
b[0]: 176
b[1]: 161
int i=b[0]*256+b[1]-65536
2.2根据汉字字符编码国标GB2312-80规则确定ASCII码对应的声母
GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。
一级字计算根据汉字ASCII码值可以方便地计算出来:其中
声母A对应ASCII码范围是:-20319至-20284
声母B对应ASCII码范围是:-19775 至-19219
……
声母Z对应ASCII码范围是:-11055 至-10247
二级字计算通过编码为固定的声母字符串,当汉字ASCII码值>-10079时,通过对应字符串获取。
3 实现方法
3.1 定义
引用命名空间:System.Text
定义类:Encoding
自定义方法:
(1)计算字符ASCII值函数:Asc
参数:pStr, 字符串型
返回值:Int,字符的ASC码
(2)计算汉字声母函数:Hzpy
参数:pStr,字符串型
返回值:String, 转换后的汉字声母字符串
3.2 算法流程图
3.3 算法描述
(1)判断输入参数字符串是否为空,若为空,则结束。
(2)初始化局部变量。
(3)使用For循环,逐字符进行计算。
(4)利用Asc函数计算当前字符的ASCII码。
(5)根据ASCII值分别计算字符的声母,其中:ASCII值在-10247到-20319,属于一级字库,按拼音顺序排列,可以通过判定值直接得到声母;ASCII值大于0,则取字母“A”到“Z”;ASCII值在0到-10079之间,则从预定义的声母表中获取。
3.4 主要程序段
//计算字符串首字符的ASCII码值
public int Asc(string pStr)
{ int _i=0;
if (pStr.Length > 0)
{ string _s = pStr.Substring (0,1);//取首字符
byte[] _b = System.Text.Encoding.Default.GetBytes (_s); //计算字符的Unicode码
if (_b.Length == 1)
_i = _b[0]; //西文ASCII
else
_i = _b[0]*256+_b[1]-65536; //汉字ASCII-65536 }
return _i; }
//计算字符串对应的声母
public string Hzpy(string pStr)
{ if (pStr.Length == 0){ return "" ;}//参数是空串
string sResult = ""; //定义返回字符串变量
int t; //字符的Ascii码
string gH0="";
gH0 = InputAscii2();//从文件中加载二级字库汉字声母表
pStr = pStr.ToUpper ();
for (int i = 0 ; i < pStr.Length; i++)
{ t = Asc(pStr.Substring (i, 1));
if (t < 0)
{ if ( t >= -10079) //计算二级字库汉字声母
if (gH0.Length > 10079+t)
sResult = sResult + gH0.Substring (10079 + t,1);
else
sResult = sResult + " ";
else //计算一级字库汉字声母
{ if (t>=-20319 && t<=-20284) sResult = sResult + "A";
else if (t>=-20283 && t<=-19776) sResult = sResult + "B";
else if (t>=-19775 && t<=-19219) sResult = sResult + "C";
else if (t>=-19218 && t<=-18711) sResult = sResult + "D";
else if (t>=-18710 && t<=-18527) sResult = sResult + "E";
else if (t>=-18526 && t<=-18240) sResult = sResult + "F";
else if (t>=-18239 && t<=-17923) sResult = sResult + "G";
else if (t>=-17922 && t<=-17418) sResult = sResult + "H";
else if (t>=-17417 && t<=-16475) sResult = sResult + "J";
else if (t>=-16474 && t<=-16213) sResult = sResult + "K";
else if (t>=-16212 && t<=-15641) sResult = sResult + "L";
else if (t>=-15640 && t<=-15166) sResult = sResult + "M";
else if (t>=-15165 && t<=-14923) sResult = sResult + "N";
else if (t>=-14922 && t<=-14915) sResult = sResult + "O";
else if (t>=-14914 && t<=-14631) sResult = sResult + "P";
else if (t>=-14630 && t<=-14150) sResult = sResult + "Q";
else if (t>=-14149 && t<=-14091) sResult = sResult + "R";
else if (t>=-14090 && t<=-13319) sResult = sResult + "S";
else if (t>=-13318 && t<=-12839) sResult = sResult + "T";
else if (t>=-12838 && t<=-12557) sResult = sResult + "W";
else if (t>=-12556 && t<=-12081) sResult = sResult + "X";
else if (t==-12080) sResult = sResult + "H";
else if (t>=-12079 && t<=-11848) sResult = sResult + "X";
else if (t>=-11847 && t<=-11056) sResult = sResult + "Y";
else if (t>=-11055 && t<=-10247) sResult = sResult + "Z";
}}
else //字母和数字
{ if (t>=65 && t<=90|| t>=48 && t<=57)
sResult = sResult + pStr.Substring (i, 1); } }
return sResult; }
4 实现结果
输入:Hzpy(“ab”) , 输出:“AB“
输入:Hzpy(“我们”),输出:“WM”
输入:Hzpy(“驽一孥”),输出:“NYN”
5 小结
通过这种方法计算汉字对应声母,其中一级字库近7000个汉字,只需要通过条件判断语句即可计算出来,二级字库3000多个汉字通过预编码,直接一一对应产生。与过去通过一个汉字对应一个字符的方式相比,这种方法不需要专门的数据文件进行存储,不仅大大提高了计算速度,而且十分容易在不同的开发语言中进行移植,具有非常显著的实用性。
参考文献:
[1]规范. GB2312-80《信息交换用汉字编码字符集 基本集》[S]. 北京: 中国标准出版,2003。
[2]葛季栋等. 利用数据字典创建维护数据库基表[J]. 北京: 微型机与应用,2002。
[3]美Jason Price Mike Gunderloy.《Visual C#.NET 从入门到精通》[M]. 北京: 电子工业出版社,2003。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。