基于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 读写txt文件 json文件的实现方法
Oct 22 Python
python中执行shell的两种方法总结
Jan 10 Python
python编程实现希尔排序
Apr 13 Python
Python之str操作方法(详解)
Jun 19 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
python Socket之客户端和服务端握手详解
Sep 18 Python
TensorFlow实现卷积神经网络CNN
Mar 09 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
Python 动态变量名定义与调用方法
Feb 09 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
利用python画出AUC曲线的实例
Feb 28 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 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
输出控制类
2006/10/09 PHP
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
php生成扇形比例图实例
2013/11/06 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
php判断是否为json格式的方法
2014/03/04 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
Python验证企业工商注册码
2015/10/25 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
Python3数字求和的实例
2019/02/19 Python
Django实现文件上传下载功能
2019/10/06 Python
Python selenium自动化测试模型图解
2020/04/15 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
业务经理的岗位职责
2013/11/16 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
雷人标语集锦
2014/06/19 职场文书
捐款活动总结
2014/08/27 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
企业财务经理岗位职责
2015/04/08 职场文书