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

推荐订阅源

S
Security @ Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
G
GRAHAM CLULEY
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
I
Intezer
S
Securelist
Google DeepMind News
Google DeepMind News
S
Schneier on Security
T
Troy Hunt's Blog
Help Net Security
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
Security Archives - TechRepublic
Security Archives - TechRepublic
O
OpenAI News
博客园 - Franky
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
P
Privacy International News Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Google Online Security Blog
Google Online Security Blog
Latest news
Latest news
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
博客园_首页
S
Security Affairs
PCI Perspectives
PCI Perspectives
WordPress大学
WordPress大学
C
Cisco Blogs
Recent Announcements
Recent Announcements
L
LangChain Blog
GbyAI
GbyAI
F
Fortinet All Blogs
N
News and Events Feed by Topic
T
Tor Project blog
IT之家
IT之家
P
Palo Alto Networks Blog
D
DataBreaches.Net
小众软件
小众软件
宝玉的分享
宝玉的分享
F
Full Disclosure

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