基于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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
python获取指定网页上所有超链接的方法
Apr 04 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
django query模块
Apr 20 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
python 链接sqlserver 写接口实例
Mar 11 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
Python decimal模块使用方法详解
Jun 08 Python
Python如何绘制日历图和热力图
Aug 07 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
详解在OpenCV中如何使用图像像素
Mar 03 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
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
js单例模式的两种方案
2013/10/22 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
详解JS函数重载
2014/12/04 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
Python 如何实现访问者模式
2020/07/28 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
HTML5地理定位实例
2014/10/15 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
安全生产投入制度
2014/01/29 职场文书
责任书格式范文
2014/07/28 职场文书
政风行风评议整改方案
2014/09/15 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python