基于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实现HTTP协议下的文件下载方法总结
Apr 20 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
python多线程扫描端口(线程池)
Sep 04 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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
PHP 模拟登陆MSN并获得用户信息
2009/05/16 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
Python中字符串的格式化方法小结
2016/05/03 Python
python中解析json格式文件的方法示例
2017/05/03 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
Java里面如何创建一个内部类的实例
2015/01/19 面试题
历史学专业毕业生求职信
2013/09/27 职场文书
办公室主任岗位职责
2013/11/08 职场文书
党支部先进事迹材料
2014/12/24 职场文书
求职自我评价范文
2015/03/09 职场文书
公司禁烟通知
2015/04/23 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
MySQL之DML语言
2021/04/05 MySQL
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis