基于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 自动安装 Rising 杀毒软件
Apr 24 Python
python求crc32值的方法
Oct 05 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
Python中%r和%s的详解及区别
Mar 16 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
python中PyQuery库用法分享
Jan 15 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 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 htmlspecialchars加强版
2010/02/16 PHP
php生成略缩图代码
2012/07/16 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
Python selenium自动化测试模型图解
2020/04/15 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
UDP协议功能
2013/01/06 面试题
学生会干部自荐信
2014/02/04 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
商铺门前三包责任书
2014/07/25 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2015年超市工作总结
2015/04/09 职场文书
人生遥控器观后感
2015/06/11 职场文书
Python实现byte转integer
2021/06/03 Python
python全面解析接口返回数据
2022/02/12 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js