基于python的漢字轉(zhuǎn)GBK碼實(shí)現(xiàn)代碼

如圖,“廣”的編碼為%B9%E3,暫且把%B9稱(chēng)為節(jié)編碼,%E3為字符編碼(第二編碼)。
思路:
從GBK編碼頁(yè)面收集漢字 http://ff.163.com/newflyff/gbk-list/
從實(shí)用角度下手,只選取“● GBK/2: GB2312 漢字”這一節(jié),共3755個(gè)漢字。
看規(guī)律:小節(jié)編碼從B0-D7,而針對(duì)漢字的編碼從A1-FE,即16*6-2=94,非常有規(guī)律性。
第一步:把常用的漢字用python提取出來(lái),按順序存到一個(gè)字典文件里面,漢字用空格分隔。
第二步:根據(jù)編碼從A1-FE,每節(jié)94個(gè)漢字的規(guī)律,先定位節(jié)編碼,利用漢字在某一節(jié)的位置定位字符編碼
實(shí)施:
第一步:提取漢字
with open('E:/GBK.txt') as f:
s=f.read().splitlines().split()
分割得到的list里面有重復(fù)的節(jié)編碼,要去掉B0/B1……類(lèi)似的符號(hào)和中文的0-9/A-F字符
把獲取到的字符解碼看:


刪除掉這些字符:
先把分割得到的list全部解碼,然后
gbk.remove(u'\uff10')
這里刪除字符的時(shí)候,用range生成一系列字符串,然后用notepad++處理了一下,并沒(méi)有找到簡(jiǎn)單的辦法
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這樣的小節(jié)編碼,同時(shí)提取字符編碼的時(shí)候也要用到類(lèi)似的A1-FE這樣的編碼,于是就想生成這樣一個(gè)list,方便做刪除和索引操作。
生成編碼系列:
行編碼為0-9 A-F,列編碼為A-F
從A1開(kāi)始遞增,遇到邊界(A9-AA)要手動(dòng)處理,用到了ord()和chr()函數(shù),在ASCII編碼和數(shù)字之間轉(zhuǎn)換。
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
得到的列表:

有了這個(gè)編碼序列后,就可以從gbk庫(kù)中刪除B0-D7字符了。
最后檢查到還有空格未刪除,空格的unicode碼是\u3000
gbk.remove(u'\u3000')
最后encode成UTF-8編碼保存到字典文件。

我把這個(gè)字典文件放到網(wǎng)盤(pán)上了,外鏈:http://dl.dbank.com/c0m9selr6h
第二步:索引漢字
索引就是個(gè)簡(jiǎn)單算法,因?yàn)樽值淅锩娴臐h子是按照原先順序存儲(chǔ)的,而且GBK編碼表2的3755個(gè)漢字嚴(yán)格遵守每節(jié)94個(gè)漢字的規(guī)律,那就來(lái)個(gè)簡(jiǎn)單的除數(shù)取整+1來(lái)定位小節(jié)編碼,再用漢字索引-節(jié)索引*94得到漢字在這一小節(jié)中的索引,然后利用上面生成的A1-FE list和索引來(lái)定位第二編碼。
算法思路有了,編碼,然后調(diào)試
附上python代碼和注釋?zhuān)?
def getGBKCode(gbkFile='E:/GBK1.1.txt',s=''):
#gbkFile字典文件 共3755個(gè)漢字
#s為要轉(zhuǎn)換的漢字,暫且為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
#依次索引每個(gè)漢字
l=list()
for st in s.decode('gb2312'):
st=st.encode('utf-8')
i=gbk.index(st)+1
#小節(jié)編碼從B0開(kāi)始,獲取漢字的小節(jié)編碼
t1='%'+t[t.index('B0'):][i/94]
#漢字在節(jié)點(diǎn)中的索引號(hào)
i=i-(i/94)*94
t2='%'+t[i-1]
l.append(t1+t2)
#最后用空格分隔輸出
return ' '.join(l)

得承認(rèn)我的python代碼不是那么工整
附上我的微博ID:小欒Cooper
- Python基于有道實(shí)現(xiàn)英漢字典功能
- python獲取一組漢字拼音首字母的方法
- Python找出文件中使用率最高的漢字實(shí)例詳解
- python實(shí)現(xiàn)將漢字轉(zhuǎn)換成漢語(yǔ)拼音的庫(kù)
- python用字典統(tǒng)計(jì)單詞或漢字詞個(gè)數(shù)示例
- python使用reportlab畫(huà)圖示例(含中文漢字)
- python實(shí)現(xiàn)統(tǒng)計(jì)漢字/英文單詞數(shù)的正則表達(dá)式
- Python 返回漢字的漢語(yǔ)拼音
- Python輸出漢字字庫(kù)及將文字轉(zhuǎn)換為圖片的方法
相關(guān)文章
使用python接受tgam的腦波數(shù)據(jù)實(shí)例
這篇文章主要介紹了使用python接受tgam的腦波數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python3多線程處理爬蟲(chóng)的實(shí)戰(zhàn)
本文主要介紹了Python3多線程處理爬蟲(chóng)的實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
python dataframe向下向上填充,fillna和ffill的方法
今天小編就為大家分享一篇python dataframe向下向上填充,fillna和ffill的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Django項(xiàng)目后臺(tái)不掛斷運(yùn)行的方法
今天小編就為大家分享一篇Django項(xiàng)目后臺(tái)不掛斷運(yùn)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
使用Python獲取愛(ài)奇藝電視劇彈幕數(shù)據(jù)的示例代碼
這篇文章主要介紹了用Python獲取愛(ài)奇藝電視劇彈幕數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例
下面小編就為大家分享一篇python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí)
python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí),示例使用了beautifulsoup庫(kù)分析HTML代碼,beautifulsoup是一個(gè)HTML/XML解析器,可以用來(lái)做網(wǎng)頁(yè)爬蟲(chóng)2014-01-01
python調(diào)用dll出現(xiàn)精度問(wèn)題解決
本文主要介紹了python調(diào)用dll出現(xiàn)精度問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
利用Vscode進(jìn)行Python開(kāi)發(fā)環(huán)境配置的步驟
這篇文章主要給大家介紹了關(guān)于如何利用Vscode進(jìn)行Python開(kāi)發(fā)環(huán)境配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

