这个文件的结构很简单,每一行的基本结构是这样的:
引用
4E04 (shang4,shang3)
前面的 4E04 是汉字的Unicode编码,空格分隔,然后括号里面包含了所有读音(而且看起来像是按频率排序好了的),每个读音分别给出了拼音的声母韵母以及声调。
在这个基础上解析它就相当简单了。
f = open("unicode_to_hanyu_pinyin.txt", "r")
py = {}
for l in f:
l = l.strip() #行末回车
key, val = l.split(' ')
sd = val[1:-1].replace('u:', 'v').split(',') #去掉左右括号,把u:转为v(驴 lv),然后按逗号分隔
arr_sd = []
for i in sd:
arr_sd.append({'py': i[0:-1], 'tone': i[-1]}) #把每个读音的声调分离出来
py[int(key, 16)] = arr_sd #把unicode编码转成10进制作为key
f.close()
py = {}
for l in f:
l = l.strip() #行末回车
key, val = l.split(' ')
sd = val[1:-1].replace('u:', 'v').split(',') #去掉左右括号,把u:转为v(驴 lv),然后按逗号分隔
arr_sd = []
for i in sd:
arr_sd.append({'py': i[0:-1], 'tone': i[-1]}) #把每个读音的声调分离出来
py[int(key, 16)] = arr_sd #把unicode编码转成10进制作为key
f.close()
当然,你也可以把它存入一个key/value数据库(memcachedb什么的就挺好)。以上面的例子的话,把一个字符串中的汉字转换成拼音就很简单了:
def convert(str, encoding = 'utf-8'):
ret = ''
for i in str.decode(encoding):
w = ord(i)
if py.has_key(w):
ret += "%s-%s " % (py[w][0]['py'] , py[w][0]['tone'])
else:
ret += i
return ret
ret = ''
for i in str.decode(encoding):
w = ord(i)
if py.has_key(w):
ret += "%s-%s " % (py[w][0]['py'] , py[w][0]['tone'])
else:
ret += i
return ret
要注意的一点是,“驴”的拼音被标记为 lu:2 ,而不是打字时习惯使用的 lv ,如果有需要的,还得再加个简单的转换逻辑。
实际上这个库里头还支持通用拼音(貌似是台湾地区使用过的)等其他转换方式,有需要的同学可以自己考据一下其结构。
p.s. 在python里头可以用 unichr(0x4E04) 得到这个unicode对应的字符,也可以用 ord('率'.decode('utf-8')) 得到这个字符的unicode编码(注意替换字符的原始编码)。至于十进制和十六进制的转换,也很简单, hex(32768) 得到 '0x8000' 而int('0x8000', 16)就能得到32768。python真好用。





