惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - cpunion

使用dpkt和pcap抓包 [收藏] jfwan实现的一个C++委托类 [c++] c++0x中的auto和typeof ACE_TP_Reactor的限制 ACE_SOCK_Stream send和recv超时设置 哀悼18位在车祸中死去的人 对ACE_TP_Reactor定时器处理机制做一点修改。 C++编写“异步调用代理组件”的一点想法 有趣的东西:Test () () () () () () () () () (); - cpunion VC2005 Beta 2 模板偏特化有些问题 [python] and or 表达式陷阱一则。 Media Player Classic外挂字幕时间调整脚本 我们的标准化委员会网站在哪? 不就是个座嘛 answers.com真是个不错的网站 《星际之门》和《亚特兰蒂斯》总算是更新了 [假如设计一个新语言] 哪些语言特性是我想要的 写一个CopyOnWrite的通用实现(C++) - cpunion - 博客园 Python写的一个适配器类。
生成gb2312码表 - cpunion - 博客园
cpunion · 2005-07-30 · via 博客园 - cpunion

朋友的一个输入法项目中,需要如下格式:

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(0xb00xf8):
    
for low in range(0xa10xff):
        
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(0xb00xf8):
    
for low in range(0xa10xff):
        
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文件太大,就不放上来了。。。。