生成gb2312码表

朋友的一个输入法项目中,需要如下格式:
BYTE PY_mb_a []       =  { " 阿呵吖嗄腌锕阿啊呵呵呵锕嗄嗄吖腌 " };

BYTE PY_mb_ai []     
=  { " 爱矮挨哎碍癌艾唉哀蔼隘埃皑呆嗌嫒瑷暧捱砹嗳锿霭乃剀呃噫奇阂呆呆呃隘阂阂阂奇剀乃奇嗌艾嗌噫奇埃 " };

BYTE PY_mb_an []     
=  { " 按安暗岸俺案鞍氨胺厂广庵揞犴铵桉谙鹌埯黯干盒钳顸厂庵胺干广顸厂盒钳谙鹌俺厂埯广庵揞揞 " };

BYTE PY_mb_ang []    
=  { " 昂肮盎仰肮肮仰昂 " };

只要求GB2312码表中存在的汉字。

实现起来比较简单:
1、生成gb2312汉字码表。gb2312中汉字高位范围是0xb0-0xf7,低位是0xa1-0xfe,0xd7fa-0xd7fe这5个位置为空,生成代码如下:
gb2312_table  =   set ([])
for  high  in  range( 0xb0 0xf8 ):
    
for  low  in  range( 0xa1 0xff ):
        
if  high  ==   0xd7  and  0xfa   <=  low  <=   0xfe :
            
continue
        gb2312_table.add (unicode(chr(high) 
+  chr(low),  ' gb2312 ' ))

2、获得这些汉字的拼音。拼音可由拼音输入法码表文件获得。由于是在windows 2003环境下,没有安装输入法生成器,所以需要在安装光盘I386目录下找到expand.exe和imegen.ex_这2个文件,拷到某个目录下,执行expand imegen.ex_ imegen.exe,即可获得输入法生成器程序imegen.exe,运行它并使用逆转换,由windows\system32下的winpy.mb文件逆转换得到winpy.txt,使用记事本转为utf-8编码,并把前面几行无关的删掉。也可以不转为utf-8,默认生成是utf-16,更改下面程序中的编码即可。

3、生成拼音-汉字映射表。
=  open ( ' c:\\winpy.txt ' ' r+ ' )

py_hz 
=  {}

for  line  in  f.readlines():
    line 
=  unicode(line.split( ' \n ' )[ 0 ],  ' utf-8 ' )
    
if  len(line)  <   2  or line[ 1 <   ' a '  or line[ 1 >   ' z ' :
        
continue
    hz, pys 
=  line[ 0 ], line[ 1 :].split ()
    
if  hz not  in  gb2312_table:
        
continue
    
for  py  in  [i  for  i  in  pys  if  i  !=   ' pianpang ' ]:
        py_hz.setdefault (py, []).append (hz)
f.close()

读取每一行,并解码得到unicode字符串。
如果长度<2,则是无效字符串,忽略;如果第2个字符不是a-z之间的字符,则这一行是词组,忽略。
然后取第一个字符为汉字,第2个字符以后可能有多个拼音,split得到一组拼音(多音节情况下,单音节只有一个拼音)。
如果这个汉字不在gb2312范围内,忽略它。
如果拼音是pianpang(表示“偏旁”),忽略它。
把拼音-汉字映射加入到映射表中,映射表的key是拼音,value是个list,存放有此读音的所有汉字。

4、输出文件:
=  open ( ' c:\\o.c ' ' w+ ' )
for  key  in  sorted(py_hz.keys ()):
    varname 
=  u ' BYTE PY_mb_ '   +  key  +  u '  [] '
    f.write (varname.ljust(
20 ).encode( ' mbcs ' ))
    f.write (
'  = {" ' )
    
for  value  in  py_hz [key]:
        f.write (value.encode(
' mbcs ' ))
    f.write (
' "};\r\n ' )
f.close()

这个比较简单了。

整个程序如下:

gb2312_table  =   set ([])
for  high  in  range( 0xb0 0xf8 ):
    
for  low  in  range( 0xa1 0xff ):
        
if  high  ==   0xd7  and  0xfa   <=  low  <=   0xfe :
            
continue
        gb2312_table.add (unicode(chr(high) 
+  chr(low),  ' gb2312 ' ))

=  open ( ' c:\\winpy.txt ' ' r+ ' )

py_hz 
=  {}

for  line  in  f.readlines():
    line 
=  unicode(line.split( ' \n ' )[ 0 ],  ' utf-8 ' )
    
if  len(line)  <   2  or line[ 1 <   ' a '  or line[ 1 >   ' z ' :
        
continue
    hz, pys 
=  line[ 0 ], line[ 1 :].split ()
    
if  hz not  in  gb2312_table:
        
continue
    
for  py  in  [i  for  i  in  pys  if  i  !=   ' pianpang ' ]:
        py_hz.setdefault (py, []).append (hz)
f.close()

=  open ( ' c:\\o.c ' ' w+ ' )
for  key  in  sorted(py_hz.keys ()):
    varname 
=  u ' BYTE PY_mb_ '   +  key  +  u '  [] '
    f.write (varname.ljust(
20 ).encode( ' mbcs ' ))
    f.write (
'  = {" ' )
    
for  value  in  py_hz [key]:
        f.write (value.encode(
' mbcs ' ))
    f.write (
' "};\r\n ' )
f.close()

生成的o.c文件太大,就不放上来了。。。。

转载于:https://www.cnblogs.com/cpunion/archive/2005/07/30/203261.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值