基於python的漢字轉GBK碼

來源:互聯網
上載者:User

說明:

今天想用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])<57) or (ord(t[-1][1])>=65 and ord(t[-1][1])<70):
6 t.append(t[-1][0]+chr(ord(t[-1][1])+1))
7 continue
8 if ord(t[-1][1])>=57 and ord(t[-1][1])<65:
9 t.append(t[-1][0]+chr(65))
10 continue
11 if 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])<57) or (ord(t[-1][1])>=65 and ord(t[-1][1])<70):
15 t.append(t[-1][0]+chr(ord(t[-1][1])+1))
16 continue
17 if ord(t[-1][1])>=57 and ord(t[-1][1])<65:
18 t.append(t[-1][0]+chr(65))
19 continue
20 if 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

完畢,歡迎吐槽

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.