基于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实现web端用户登录和注册功能的教程
Apr 30 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
Python异常处理操作实例详解
May 10 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
python tkinter基本属性详解
Sep 16 Python
通过实例解析Python调用json模块
Dec 11 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
PyQt5实现简单的计算器
May 30 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
python 批量压缩图片的脚本
Jun 02 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获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python ansible服务及剧本编写
2017/12/29 Python
python Celery定时任务的示例
2018/03/13 Python
django中模板的html自动转意方法
2018/05/27 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
Python如何定义一个函数
2015/09/01 面试题
院领导写的就业推荐信
2014/03/09 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
离婚起诉书范本
2015/05/18 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android