编码和解码UTF-8和latin1

时间:2015-11-29 11:17:18

标签: python encoding utf-8

我正在研究某人处理数据的代码,并在此问题上遇到错误:

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)"

我想知道这里的问题是什么,以及如何解决它?

1 个答案:

答案 0 :(得分: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。它是使用{2}中的sys.getdefaultencoding() 'ascii'来触发UnicodeDecodeError

正确的方法是删除伪造的char.encode('utf-8').decode('latin1')转换并使用Unicode文字:

  • 添加正确的编码声明,例如,如果使用utf-8编码保存源文件,则将# -*- coding: utf-8 -*-放在顶部,以便在源代码中硬编码的字符串文字中的非ascii字符将被正确解释
  • 另外,添加from __future__ import unicode_literals以便'à'即使在Python 2上也会创建Unicode字符串。