一直都是用的小鸭五笔,091新字库是极点格式的,刚开始懒得动,直接用极点五笔了,用了一段时间碰到很多问题.其中最坑的是. 在tkinter Gui 里极点输入不能退格,一退格就乱码(
) ,我以为是我开发的程序有问题,调试了很久都找不到原因. 突然想到会不会是输入法问题,换个输入法就OK 了.
赶紧把极点删了,新字库导出到小鸭五笔用. 不过小鸭五笔对 一个字词有多个编码的情况,会出两顺序和字库不一致的情况.字词的排序变了。 研究了一下小鸭的出词规律,发现可以通过删除一字多码的情况来修正. 一字多码,保留简码. 去掉一些非汉字码.越简单越好呀...
1.极点导出字库:
先整理成下面字典数据结构: 一个是字对多码,一个是码对多字.
然后通过这两个结构来整理.
最后整理成小鸭五笔的导入码表
代码如下:
#!/usr/bin/python
# -*- coding: gbk -*-
# conver.py
#
# Copyright (C) 2016 - xulong <[email protected]>
# python3
#
import sys
import os
import re
import json
#import sendkeys
#import win32con
#import win32ui
#import win32gui
#import time
#定义中文字符范围
area=[]
area.append(range(0x4E00,0x9FA5+1)) #基本汉字 20902字
area.append(range(0x9FA6,0x9FEF+1)) #基本汉字补充 74字
area.append(range(0x3400,0x4DB5+1)) #扩展A 6582字
area.append(range(0x20000,0x2A6D6+1)) #扩展B 42711字
area.append(range(0x2A700,0x2B734+1)) #扩展C 4149字
area.append(range(0x2B740,0x2B81D+1)) #扩展D 222字
area.append(range(0x2B820,0x2CEA1+1)) #扩展E 5762字
area.append(range(0x2CEB0,0x2EBE0+1)) #扩展F 7473字
area.append(range(0x2F00,0x2FD5+1)) #康熙部首 214字
area.append(range(0x2E80,0x2EF3+1)) #部首扩展 115字
area.append(range(0xF900,0xFAD9+1)) #兼容汉字 477字
area.append(range(0x2F800,0x2FA1D+1)) #兼容扩展 542字
area.append(range(0xE815,0xE86F+1)) #PUA(GBK)部件 81字
area.append(range(0xE400,0xE5E8+1)) #部件扩展 452字
area.append(range(0xE600,0xE6CF+1)) #PUA增补 207字
area.append(range(0x31C0,0x31E3+1)) #汉字笔画 36字
area.append(range(0x2FF0,0x2FFB+1)) #汉字结构 12字
area.append(range(0x3105,0x312F+1)) #汉语注音 43字
area.append(range(0x31A0,0x31BA+1)) #注音扩展 22字
area.append(range(0x3000,0x303F+1)) #CJK 符号和标点 (CJK Symbols and Punctuation)
area.append(range(0x0,0xFF)) # 英文字母
#中文标点符号
area.append([
0x3002, #句号 。
0xFF1F, #问号 ?
0xFF01, #叹号 !
0xFF0C, #逗号 ,
0x3001, #顿号 、
0xFF1B, #分号 ;
0xFF1A, #冒号 :
0x300C, #引号 「
0x300D, # 」
0x300E, #引号 『
0x300F, # 』
0x2018, #引号 ‘
0x2019, # ’
0x201C, #引号 “
0x201D, # ”
0xFF08, #括号 (
0xFF09, # )
0x3014, #括号 〔
0x3015, # 〕
0x3010, #括号 【
0x3011, # 】
0x2014, #破折号 —
0x2026, #省略号 …
0x2013, #连接号 –
0xFF0E, #间隔号 .
0x300A, #书名号 《
0x300B, # 》
0x3008, #书名号 〈
0x3009 # 〉
]
)
#极点格式字库转为小鸭格式字库
def jd2xy_convert():
context = ''
with open('./freeime.txt','r',encoding='utf-16' ) as f:
context=f.read()
#取编码 a 到 yyyy
rlt = re.findall(r'\n(a .*?)\nz',context,re.S)
if len(rlt) == 1:
context = rlt[0]
#替换掉一些特殊标记
context=context.replace('~','')
context=context.replace('^','')
context=context.replace('!','')
#转换文本为对象
lns = context.splitlines()
bm_wd = {}#Key存编码,value以列表形式存对应的的字词
wd_bm = {}#key存字忘,value以列表形式存对应的的编码
for l in lns:
l=l.strip(' ')
lst=l.strip(' ').split(' ')
bm_wd[lst[0]]=lst[1:]
for i in range(1,len(lst)):
if lst[i] in wd_bm.keys():
wd_bm[lst[i]].append(lst[0])
else:
wd_bm[lst[i]]=[lst[0]]
#同字的多码排序
for bm in wd_bm:
wd_bm[bm].sort()
#输出保存方便检查
with open(u'./1.编码对字.txt','w',encoding='utf-16') as f:
f.write('{\n')
for bm in bm_wd:
f.write('%s:%s,\n'%(bm,str(bm_wd[bm])))
f.write('}\n')
with open(u'./1.字对编码.txt','w',encoding='utf-16') as f:
f.write('{\n')
for bm in wd_bm:
f.write('%s:%s,\n'%(bm,str(wd_bm[bm])))
f.write('}\n')
will_remove=[]
for ti in range(4):
for wd in wd_bm:
#包含有不非汉字表字符,移除
for c in wd:
for r in area:
if ord(c) in r:break
else:
for i in range(0,len(wd_bm[wd])):
will_remove.append((wd_bm[wd][i],wd,str(wd_bm[wd])))
#汉字只有一个编码的,跳过
if len(wd_bm[wd]) == 1:
continue
#七 a agci #花 a awci ,单字双码跳过
if len(wd) == 1 and len(wd_bm[wd]) == 2:
if wd_bm[wd][0] == wd_bm[wd][1][0] and wd_bm[wd][1][2:4]== 'ci':
continue
#同字词有多编码,后码以前辍方式包含了前码的,剔除(针对二码字词,删除对应的三四码)
for i in range(1,len(wd_bm[wd])):
if wd_bm[wd][i].startswith(wd_bm[wd][i-1]) and len(wd_bm[wd][i-1]) < 3:
will_remove.append((wd_bm[wd][i],wd,str(wd_bm[wd])))
for t in will_remove:
if t[0] in wd_bm[t[1]]: wd_bm[t[1]].remove(t[0])
if t[1] in bm_wd[t[0]]: bm_wd[t[0]].remove(t[1])
with open('./2.删除的字码.txt','w',encoding='utf-16') as f:
for t in will_remove:
f.write('%s:%s %s\n'%(t))
#清空无字词编码,并记录到文件
with open('./3.空码.txt','w',encoding='utf-16') as f:
bms = list(bm_wd.keys())
for bm in bms:
if len(bm_wd[bm]) == 0:
f.write('%s %s\n'%(bm,' '.join(bm_wd[bm])))
del bm_wd[bm]
with open('./9.转成功的小鸭字库.txt','w',encoding='utf-16') as f:
f.write('[cmd:RefCode]\n')
f.write('[cmd:RemoveAll]\n')
f.write('[cmd:Info=Gnolux专用词库]\n')
f.write(';------------------------------\n')
for bm in bm_wd:
f.write('%s %s\n'%(bm,' '.join(bm_wd[bm])))
def test_input():
bm_wd=jd2xy_convert()
for k in bm_wd:
print(k,bm_wd[k])
for i in range(1,len(bm_wd[k])+1):
if (len(bm_wd[k])) == 1 and (len(k)==4):
sendkeys.SendString('%s'%(k))
print('%s'%(k))
else:
sendkeys.SendString('%s%d'%(k,i))
print('%s%d'%(k,i))
#time.sleep(0.5)
sendkeys.UniKeyPress(win32con.VK_RETURN)
#time.sleep(1)
if __name__ == '__main__':
jd2xy_convert()
#os.startfile('notepad.exe')
#time.sleep(1)
#w=win32ui.FindWindow(None,'无标题 - 记事本')
#win32gui.SetForegroundWindow(w.GetSafeHwnd())
#time.sleep(1)
#test_input()
标签:小鸭,wd,area,bm,五笔,write,range,字库,append From: https://blog.51cto.com/fangkailove/5881719