基于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深入学习之装饰器
Aug 31 Python
Python实现的ini文件操作类分享
Nov 20 Python
Python中的Numpy矩阵操作
Aug 12 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
Python玩转加密的技巧【推荐】
May 13 Python
简单了解python中对象的取反运算符
Jul 01 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
python属于哪种语言
Aug 16 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 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/11/16 PHP
php的一个登录的类 [推荐]
2007/03/16 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
php制作文本式留言板
2015/03/18 PHP
PHP实现递归无限级分类
2015/10/22 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
JavaScript 反科里化 this [译]
2012/09/20 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
python使用marshal模块序列化实例
2014/09/25 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
10个顶级Python实用库推荐
2021/03/04 Python
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
财务会计人员求职的自我评价
2014/01/13 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
2014年小学工作总结
2014/11/26 职场文书
博士导师推荐信
2015/03/25 职场文书
预备党员转正党小组意见
2015/06/01 职场文书