朋友的一个输入法项目中,需要如下格式:
只要求GB2312码表中存在的汉字。
实现起来比较简单:
1、生成gb2312汉字码表。gb2312中汉字高位范围是0xb0-0xf7,低位是0xa1-0xfe,0xd7fa-0xd7fe这5个位置为空,生成代码如下:
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、生成拼音-汉字映射表。
读取每一行,并解码得到unicode字符串。
如果长度<2,则是无效字符串,忽略;如果第2个字符不是a-z之间的字符,则这一行是词组,忽略。
然后取第一个字符为汉字,第2个字符以后可能有多个拼音,split得到一组拼音(多音节情况下,单音节只有一个拼音)。
如果这个汉字不在gb2312范围内,忽略它。
如果拼音是pianpang(表示“偏旁”),忽略它。
把拼音-汉字映射加入到映射表中,映射表的key是拼音,value是个list,存放有此读音的所有汉字。
4、输出文件:
这个比较简单了。
整个程序如下:
生成的o.c文件太大,就不放上来了。。。。
BYTE PY_mb_a [] = {"阿呵吖嗄腌锕阿啊呵呵呵锕嗄嗄吖腌"};
BYTE PY_mb_ai [] = {"爱矮挨哎碍癌艾唉哀蔼隘埃皑呆嗌嫒瑷暧捱砹嗳锿霭乃剀呃噫奇阂呆呆呃隘阂阂阂奇剀乃奇嗌艾嗌噫奇埃"};
BYTE PY_mb_an [] = {"按安暗岸俺案鞍氨胺厂广庵揞犴铵桉谙鹌埯黯干盒钳顸厂庵胺干广顸厂盒钳谙鹌俺厂埯广庵揞揞"};
BYTE PY_mb_ang [] = {"昂肮盎仰肮肮仰昂"};
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'))
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、生成拼音-汉字映射表。
f = 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()
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、输出文件:
f = 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()
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'))
f = 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()
f = 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()
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'))
f = 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()
f = 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文件太大,就不放上来了。。。。