【问题标题】:Getting "UnicodeEncodeError: 'ascii' codec can't encode" when decoding from windows-1252? [duplicate]从 windows-1252 解码时出现“UnicodeEncodeError:'ascii'编解码器无法编码”? [复制]
【发布时间】:2015-04-13 18:19:35
【问题描述】:

我有一个chardet 认为可能是windows1252 的文件:

$ chardetect pub5.xml
pub5.xml: windows-1252 with confidence 0.73

当我尝试在 Python 中读取它然后将其写入 CSV 文件时,出现错误:

str = row[r].decode('windows-1252').encode('utf8')

我得到的错误是这样的:

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    csv_filename='output/studies.csv'
  File "parser.py", line 15, in parse_data_to_csv
    self._write_csv_file(csv_header, csv_filename, xml_files)
  File "parser.py", line 114, in _write_csv_file
    str = row[r].decode('windows-1252').encode('utf8')
  File "/Users/me/.virtualenvs/test/lib/python2.7/encodings/cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128)

我不明白为什么需要ascii 编解码器来解码来自windows-1252 的内容。有人可以帮忙吗?

失败的字符串是:aa Mixéu 2002。相同的代码在 Python 控制台中运行正常:

str = 'aa Mixéu 2002'
str.decode('windows-1252').encode('utf8')
'aa Mix\xc3\x83\xc2\xa9u 2002'

我正在使用 lxml 设置 row[r] 的值,我不知道这是否相关:

studies = root.findall('.//STUDY')
for study_wrapper in studies:
    row = {}
    row['study_name'] = study_wrapper.get('NAME')

也许 lxml 以某种方式将其设置为 ASCII?

更新:想通了:

try:
  row[r] = row[r].encode('utf-8')
except UnicodeDecodeError:
  row[r] = row[r].decode('ISO-8859-1').encode('utf-8')

似乎有些传入的字符串是 UTF8 格式,有些不是 - 来自同一个文件!

【问题讨论】:

  • print repr(row[r]) 在您尝试解码/编码之前...
  • lxml 为您将输入解码为 Unicode,您无需自己解码。
  • 这里也不需要使用chardet; XML 文档在它们的标题中说明它们在&lt;?xml ...?&gt; 前导码中被编码成什么编解码器,这就是为什么lxml 可以首先自动解码数据的原因;如果缺少前导码,则默认从 UTF-8 解码。
  • 我正在重新打开这个。无论如何,他在问题末尾添加的这个人的解决方案直接陷入了灾难。

标签: python


【解决方案1】:

我强烈怀疑isinstance(row[r],unicode) == True

这使得第一个decode break ,因为decode 需要一个字节串并返回unicode ...如果它已经有unicode,它会尝试使用默认的终端编码(通常是ascii)对其进行编码

试试:row[r].encode("utf-8")

【讨论】:

  • 谢谢,这让我走上了正确的道路(请参阅我的更新)。我以前没有尝试过,因为它使脚本在其他地方中断。似乎有些传入的字符串是 UTF8 而有些不是。
  • 好吧,你离得更近了……我想你还没有,但如果它有效,它就有效;)
猜你喜欢
  • 1970-01-01
  • 2017-03-01
  • 2015-10-21
  • 2010-12-11
  • 2012-07-02
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多