基于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显示生日是星期几的方法
May 27 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
对pandas中to_dict的用法详解
Jun 05 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
详解Python函数式编程—高阶函数
Mar 29 Python
详解python中递归函数
Apr 16 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
Python3 Click模块的使用方法详解
Feb 12 Python
PYcharm 激活方法(推荐)
Mar 23 Python
python压包的概念及实例详解
Feb 17 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
js打造数组转json函数
2015/01/14 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
旅游管理专业学生求职信
2013/09/28 职场文书
材料员岗位职责
2014/03/13 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
2015入党自荐书范文
2015/03/05 职场文书
遗嘱范文
2015/08/07 职场文书
python_tkinter事件类型详情
2022/03/20 Python
python 实现图片特效处理
2022/04/03 Python
Android Rxjava3 使用场景详解
2022/04/07 Java/Android