基于python的汉字转GBK码实现代码


Posted in Python onFebruary 19, 2012

基于python的汉字转GBK码实现代码
如图,“广”的编码为%B9%E3,暂且把%B9称为节编码,%E3为字符编码(第二编码)。

思路:
从GBK编码页面收集汉字 http://ff.163.com/newflyff/gbk-list/
从实用角度下手,只选取“● GBK/2: GB2312 汉字”这一节,共3755个汉字。
看规律:小节编码从B0-D7,而针对汉字的编码从A1-FE,即16*6-2=94,非常有规律性。
第一步:把常用的汉字用python提取出来,按顺序存到一个字典文件里面,汉字用空格分隔。
第二步:根据编码从A1-FE,每节94个汉字的规律,先定位节编码,利用汉字在某一节的位置定位字符编码

实施:
第一步:提取汉字

with open('E:/GBK.txt') as f: 
s=f.read().splitlines().split()

分割得到的list里面有重复的节编码,要去掉B0/B1……类似的符号和中文的0-9/A-F字符
把获取到的字符解码看:

基于python的汉字转GBK码实现代码

基于python的汉字转GBK码实现代码
删除掉这些字符:
先把分割得到的list全部解码,然后

gbk.remove(u'\uff10')

这里删除字符的时候,用range生成一系列字符串,然后用notepad++处理了一下,并没有找到简单的办法
for t in [u'\uff10',u'\uff11',u'\uff12',u'\uff13',u'\uff14',u'\uff15',u'\uff16',u'\uff17',u'\uff18',u'\uff19',u'\uff21',u'\uff22',u'\uff23',u'\uff24',u'\uff25',u'\uff26']: 
gbk.remove(t)

然后去除B0-D7这样的小节编码,同时提取字符编码的时候也要用到类似的A1-FE这样的编码,于是就想生成这样一个list,方便做删除和索引操作。

生成编码系列:
行编码为0-9 A-F,列编码为A-F
从A1开始递增,遇到边界(A9-AA)要手动处理,用到了ord()和chr()函数,在ASCII编码和数字之间转换。

t=['A1'] 
while True: 
if t[-1]=='FE': 
break 
if (ord(t[-1][1])>=48 and ord(t[-1][1])<57) or (ord(t[-1][1])>=65 and ord(t[-1][1])<70): 
t.append(t[-1][0]+chr(ord(t[-1][1])+1)) 
continue 
if ord(t[-1][1])>=57 and ord(t[-1][1])<65: 
t.append(t[-1][0]+chr(65)) 
continue 
if ord(t[-1][1])>=70: 
t.append(chr(ord(t[-1][0])+1)+chr(48)) 
continue

得到的列表:

基于python的汉字转GBK码实现代码

有了这个编码序列后,就可以从gbk库中删除B0-D7字符了。
最后检查到还有空格未删除,空格的unicode码是\u3000
gbk.remove(u'\u3000')
最后encode成UTF-8编码保存到字典文件。

基于python的汉字转GBK码实现代码
我把这个字典文件放到网盘上了,外链:http://dl.dbank.com/c0m9selr6h

第二步:索引汉字

索引就是个简单算法,因为字典里面的汉子是按照原先顺序存储的,而且GBK编码表2的3755个汉字严格遵守每节94个汉字的规律,那就来个简单的除数取整+1来定位小节编码,再用汉字索引-节索引*94得到汉字在这一小节中的索引,然后利用上面生成的A1-FE list和索引来定位第二编码。
算法思路有了,编码,然后调试
附上python代码和注释:

def getGBKCode(gbkFile='E:/GBK1.1.txt',s=''): 
#gbkFile字典文件 共3755个汉字 
#s为要转换的汉字,暂且为gb2312编码,即从IDLE输入的汉字编码 #读入字典 
with open(gbkFile) as f: 
gbk=f.read().split() 
#生成A1-FE的索引编码 
t=['A1'] 
while True: 
if t[-1]=='FE': 
break 
if (ord(t[-1][1])>=48 and ord(t[-1][1])<57) or (ord(t[-1][1])>=65 and ord(t[-1][1])<70): 
t.append(t[-1][0]+chr(ord(t[-1][1])+1)) 
continue 
if ord(t[-1][1])>=57 and ord(t[-1][1])<65: 
t.append(t[-1][0]+chr(65)) 
continue 
if ord(t[-1][1])>=70: 
t.append(chr(ord(t[-1][0])+1)+chr(48)) 
continue 
#依次索引每个汉字 
l=list() 
for st in s.decode('gb2312'): 
st=st.encode('utf-8') 
i=gbk.index(st)+1 
#小节编码从B0开始,获取汉字的小节编码 
t1='%'+t[t.index('B0'):][i/94] 
#汉字在节点中的索引号 
i=i-(i/94)*94 
t2='%'+t[i-1] 
l.append(t1+t2) 
#最后用空格分隔输出 
return ' '.join(l)

基于python的汉字转GBK码实现代码

得承认我的python代码不是那么工整
附上我的微博ID:小栾Cooper

Python 相关文章推荐
python学习手册中的python多态示例代码
Jan 21 Python
Python写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
Python开发的HTTP库requests详解
Aug 29 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
python调用接口的4种方式代码实例
Nov 19 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
python安装sklearn模块的方法详解
Nov 28 Python
python 装饰器功能以及函数参数使用介绍
Jan 27 #Python
Python常见文件操作的函数示例代码
Nov 15 #Python
python 控制语句
Nov 03 #Python
python 不关闭控制台的实现方法
Oct 23 #Python
python中将阿拉伯数字转换成中文的实现代码
May 19 #Python
python访问纯真IP数据库的代码
May 19 #Python
Python模块学习 re 正则表达式
May 19 #Python
You might like
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
javascript回调函数详解
2018/02/06 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
详解babel升级到7.X采坑总结
2019/05/12 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
PHP面试题附答案
2015/11/28 面试题
开工仪式主持词
2014/03/20 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
护士自荐信范文
2015/03/25 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
调研报告的主要写法
2019/04/18 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers