天天看點

python對16位unicode漢字處理

 最近筆者遇到了一個頭疼的問題,從一個檔案中讀出的字元串裡所有的漢字都是由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”替換回來,再使用上面提的方法進行解碼,解碼完之後,再将“%$”替換為"/",這樣問題解決了,貌似也沒有太多的性能損失。

  不知道有沒有更好的辦法,今後碰到了再想更優化的辦法~