最近筆者遇到了一個頭疼的問題,從一個檔案中讀出的字元串裡所有的漢字都是由unicode編碼的,必須對這些字元串進行解碼,将漢字還原。例如:字元串中是"/u7ae0",必須把它轉換為u"/7ae0",即漢字中的“章”。
就這樣一個簡單的漢字解碼,筆者嘗試了三次之後才搞定。
1. 第一階段,粗放式的原始社會
在python中有直接對單個unicode進行解碼的函數,unichr()函數,通過它可以将輸入的字元串轉換為unicode碼,但是要注意的是,unichr()函數的輸入參數不是字元串,是以必須首先把字元串專程整型。
第一種方法為
ncode = int(char1,16)
uchar = unichr(ncode)
這樣可以把單一個漢字轉換,但是問題是,字元串中有大量的待轉換,甚至有的字元串中就有十萬記待轉換的漢字字元,這樣必須使用循環對每個字元進行轉換,嚴重影響效率。
2.第二階段,衆裡尋他千百度
第一種方法實在是不能滿足需求,就在筆者将要放棄之時,在網上搜尋到了解決的辦法。使用decode/encode函數,decode函數和encode函數接受一個字元串做參數傳回該字元串對應的解碼後/編碼後的字元串。其實這個函數之前就有考慮過,但是沒找到對應的參數。
解決方法:
str = str.decode('unicode_escape')
str = str.encode('gbk')
第一步将字元串解碼為unicode,第二步将unicode碼編碼為gbk漢字碼。
此種方法能夠将整個字元串中的漢字全部編碼。
3.第三階段,排除小問題
有了第二種方法,貌似問題迎刃而解,但是在實際使用過程中,還出現了一個小問題,在解碼中,字元串中反斜杠字元被誤認為轉義字元了,存在部分反斜杠被誤解碼。
解決的方法是一個笨辦法:
首先将/u替換其他某個字元如 “%u”,然後把所有的“/”,替換為“%$”,然後再把“%u”替換回來,再使用上面提的方法進行解碼,解碼完之後,再将“%$”替換為"/",這樣問題解決了,貌似也沒有太多的性能損失。
不知道有沒有更好的辦法,今後碰到了再想更優化的辦法~