说明:
今天想用python调用百度框计算的搜过结果,看到了URL里面的汉字用GBK编码,虽然可以直接在URL里面加入中文,之前也做过一个简体字转GBK码的python函数,但还是略嫌麻烦,今天改了一下。
如图,“广”的编码为%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个汉字的规律,先定位节编码,利用汉字在某一节的位置定位字符编码
实施:
第一步:提取汉字
View Code
1 with open('E:/GBK.txt') as f:
2 s=f.read().splitlines().split()
分割得到的list里面有重复的节编码,要去掉B0/B1……类似的符号和中文的0-9/A-F字符
把获取到的字符解码看:
删除掉这些字符:
先把分割得到的list全部解码,然后
View Code
1 gbk.remove(u'\uff10')
这里删除字符的时候,用range生成一系列字符串,然后用notepad++处理了一下,并没有找到简单的办法
View Code
1 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']:
2 gbk.remove(t)
然后去除B0-D7这样的小节编码,同时提取字符编码的时候也要用到类似的A1-FE这样的编码,于是就想生成这样一个list,方便做删除和索引操作。
生成编码系列:
行编码为0-9 A-F,列编码为A-F
从A1开始递增,遇到边界(A9-AA)要手动处理,用到了ord()和chr()函数,在ASCII编码和数字之间转换。
1 t=['A1']
2 while True:
3 if t[-1]=='FE':
4 break
5 if (ord(t[-1][1])>=48 and ord(t[-1][1])=65 and ord(t[-1][1])=57 and ord(t[-1][1])=70:
12 t.append(chr(ord(t[-1][0])+1)+chr(48))
13 continue
得到的列表:
有了这个编码序列后,就可以从gbk库中删除B0-D7字符了。
最后检查到还有空格未删除,空格的unicode码是\u3000
gbk.remove(u'\u3000')
最后encode成UTF-8编码保存到字典文件。
我把这个字典文件放到网盘上了,外链:http://dl.dbank.com/c0m9selr6h
第二步:索引汉字
索引就是个简单算法,因为字典里面的汉子是按照原先顺序存储的,而且GBK编码表2的3755个汉字严格遵守每节94个汉字的规律,那就来个简单的除数取整+1来定位小节编码,再用汉字索引-节索引*94得到汉字在这一小节中的索引,然后利用上面生成的A1-FE list和索引来定位第二编码。
算法思路有了,编码,然后调试
附上python代码和注释:
1 def getGBKCode(gbkFile='E:/GBK1.1.txt',s=''):
2 #gbkFile字典文件 共3755个汉字
3 #s为要转换的汉字,暂且为gb2312编码,即从IDLE输入的汉字编码
4
5 #读入字典
6 with open(gbkFile) as f:
7 gbk=f.read().split()
8
9 #生成A1-FE的索引编码
10 t=['A1']
11 while True:
12 if t[-1]=='FE':
13 break
14 if (ord(t[-1][1])>=48 and ord(t[-1][1])=65 and ord(t[-1][1])=57 and ord(t[-1][1])=70:
21 t.append(chr(ord(t[-1][0])+1)+chr(48))
22 continue
23 #依次索引每个汉字
24 l=list()
25 for st in s.decode('gb2312'):
26 st=st.encode('utf-8')
27 i=gbk.index(st)+1
28 #小节编码从B0开始,获取汉字的小节编码
29 t1='%'+t[t.index('B0'):][i/94]
30 #汉字在节点中的索引号
31 i=i-(i/94)*94
32 t2='%'+t[i-1]
33 l.append(t1+t2)
34 #最后用空格分隔输出
35 return ' '.join(l)
得承认我的python代码不是那么工整
附上我的微博ID:小栾Cooper
完毕,欢迎吐槽
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com