2015-11-29 40 views
0

我學習處理數據別人的代碼,並在此行得到了錯誤:編碼和解碼UTF-8和latin1的

chars_sst_mangled = ['à', 'á', 'â', 'ã', 'æ', 'ç', 'è', 'é', 'í', 
'í', 'ï', 'ñ', 'ó', 'ô', 'ö', 'û', 'ü'] 
sentence_fixups = [(char.encode('utf-8').decode('latin1'), char) for char in chars_sst_mangled] 

的錯誤消息是

"UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)" 

我不知道有什麼問題在這裏,以及如何解決它?

+0

看來你在python 2.X中運行這個代碼片段。由於'encode()'方法用於將unicode轉換爲字節,並且您試圖將字節序列(編碼字符)轉換爲字節python引發此錯誤,爲解決此問題,您可以使用'decode() '方法,將字符串(原始8位值)轉換爲unicode。 – Kasramvd

回答

2

代碼被破壞。

特定錯誤表明您正在嘗試使用python2可執行以運行Python代碼3:

>>> 'à'.encode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

'à'是關於Python 2字節字符串,因此調用.encode()方法需要對字節串首先解碼爲Unicode。它使用sys.getdefaultencoding(),即Python 2中的'ascii'來觸發UnicodeDecodeError

正確的方法是放棄假char.encode('utf-8').decode('latin1')轉換和使用Unicode文本來代替:

  • 添加正確的編碼聲明例如,如果源文件使用UTF-8編碼保存,然後把# -*- coding: utf-8 -*-頂部所以在源硬編碼在字符串中,非ASCII字符將被正確解釋
  • 此外,添加from __future__ import unicode_literals使'à'將創建一個Unicode字符串甚至Python的2