基於python的漢字轉GBK碼實現代碼

來源:互聯網
上載者:User


,“廣”的編碼為%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字元
把擷取到的字元解碼看:


刪除掉這些字元:
先把分割得到的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

得到的列表:

有了這個編碼序列後,就可以從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代碼和注釋:

複製代碼 代碼如下: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代碼不是那麼工整
附上我的微博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.