基于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笔记(叁)继续学习
Oct 24 Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 Python
Django 前后台的数据传递的方法
Aug 08 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
用python打印菱形的实操方法和代码
Jun 25 Python
python变量的存储原理详解
Jul 10 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
python输出数学符号实例
May 11 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 mssql 时间格式问题
2009/01/13 PHP
php模板原理讲解
2013/11/13 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python类继承用法实例分析
2014/10/10 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Django REST framework 视图和路由详解
2019/07/19 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
应届大学生求职信
2013/12/01 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫