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

推荐订阅源

S
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
Security Latest
Security Latest
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
T
Tor Project blog
T
Threatpost
NISL@THU
NISL@THU
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
K
Kaspersky official blog
W
WeLiveSecurity
L
LINUX DO - 热门话题
小众软件
小众软件
Recorded Future
Recorded Future
B
Blog RSS Feed
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
L
Lohrmann on Cybersecurity
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
爱范儿
爱范儿
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Hacker News: Front Page
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
Scott Helme
Scott Helme
V2EX - 技术
V2EX - 技术

博客园 - 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文件太大,就不放上来了。。。。