python筆記:字元編碼錯誤處理

  • 2019 年 11 月 21 日
  • 筆記

淚奔

'ascii' codec can't encode character

duang,duang,duang。 曾幾何時,這句話困擾我好多年。。 今天終於弄清了出現這句話的原因。

背景

有了不同語言就有不同的編碼,伴隨著各種稀奇古怪的字元,字元編碼一直是程式設計師心中永遠的痛。。 為了在不同的編碼中切換,在python中,表達字元串是有兩種類型的:

unicode  str

沒錯,就是這麼任性。

他們之間存在下面的關係:

unicode ---encode---> str  str     ---decode---> unicode

unicode是python的內置編碼,以它為中間跳板,可以把字元串在不同的編碼中轉換。 然而,這兩種類型,直接相加會發生戲劇化的隱式轉換。而這個轉換,與你的系統編碼有關!

如果你的機器是ascii的編碼(很遺憾,米國的大部分機器還就是這個編碼),那麼,在 uni_str + xcode_str的時候,uni_str會自動進行encode("ascii"),如果此時uni_str中有中文的話,那就要掛掛了。

解決

別讓它們不同類型相加不就行了。 方法一,把unicode轉成正確編碼的str:

filename = u"大豬.txt" #顯示成什麼取決於你的機器  result = filename.encode("utf-8") + "haha"

方法二,將str轉成unicode:

filename = u"大豬.txt" #顯示成什麼取決於你的機器  result = filename + "haha你".decode('utf-8')  print(result.encode("utf-8"))

注意,Print函數如果列印的是系統不認識的編碼,還是要掛的哦。所以最後的.encode("utf-8")必不可少,真是一步一坑啊。 就這樣,解決了。 就醬,解決了。

識別未知文字

有時候,我們需要對網路上的亂七八糟的東西進行編碼。這才是神坑。網頁上如果有爬蟲得來的內容,很可能是一個大大的亂碼。 比如,在資料庫中,有一行這樣的數據u'xd7xeeŒxc5xb5xc4xcfxc2xc2',如何把它正常的顯示出來需要做一些判定了。 用下面的函數可以比較好的處理已經入庫的各種編碼。

# coding:utf-8  text0 = u'xd7xeeŒxc5xb5xc4xcfxc2xc2xa5xb7xbdxcaxbd'  text1 = u'xd7xeeŒxc5xb5xc4xcfxc2xc2'  text2 = u'u7528u4e86u4e00u4e0bu5348u7ec8u4e8eu628au6c34u94f2u5149u4e86'    def utf8_or_empty(text):      if repr(text).startswith('u'): # 說明是utf-8字元串          attr = repr(text)[2:4]          if attr == u'\u':              # unicode字元串,直接返回              return text          elif attr == u'\x':              # utf-8 or gbk的字元串              try:                  temp_text = text.encode('raw_unicode_escape').decode('utf-8')              except UnicodeDecodeError:                  temp_text = u""              if not temp_text:                  try:                      temp_text = text.encode('raw_unicode_escape').decode('gbk')                  except:                      temp_text = u""              return temp_text    print type(utf8_or_empty(text0))  print utf8_or_empty(text0)    print type(utf8_or_empty(text1))  print utf8_or_empty(text1)    print type(utf8_or_empty(text2))  print utf8_or_empty(text2)

參考資料:http://pydoc.net/Python/CodeConvert/2.0.0/CodeConvert/