基于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读写excel的方法
Nov 18 Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 Python
Python-嵌套列表list的全面解析
Jun 08 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
python requests模拟登陆github的实现方法
Dec 26 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
Python制作动态字符画的源码
Aug 04 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
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP中include()与require()的区别说明
2010/03/10 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
Js面试算法详解
2018/04/08 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
Hotels.com越南:酒店预订
2019/10/29 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
期末总结的个人自我评价
2013/11/02 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
超市5.1促销活动
2014/01/15 职场文书
土木工程专业推荐信
2014/02/19 职场文书
大学信息公开实施方案
2014/03/09 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
食品安全演讲稿
2014/09/01 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
刑事案件上诉状
2015/05/23 职场文书
初三数学教学反思
2016/02/17 职场文书