UnicodeEncodeError:'ascii'编解码器无法编码字符u'\ xa3'

问题描述

您的代码显示x.decode,但您遇到了 错误- 含义x已经是Unicode,因此,要对其进行“解码”,必须先将其转换为字节字符串(这是认编解码器ansi出现并失败的地方) 。在您的文本中,您说“如果我将ot重写为x。 ”……这似乎意味着您 知道x是Unicode。

那么,您正在做什么- 对unicodex进行编码以获得字节的编码字符串,或者将一个字节的字符串解码为unicode对象?

我发现不幸的是,您可以调用encode字节字符串和decodeunicode对象,因为我发现它似乎只会导致用户困惑,但是……至少在这种情况下,您似乎设法传播了困惑(在至少对我来说;-)。

如果看起来x是unicode,那么您永远都不想“解码”它-您可能希望使用某种编解码器(例如latin-1)对它进行 以获取字节串,如果您需要某种编码的话。 I / O目的(对于您自己的内部程序使用,我建议始终使用unicode -仅在绝对 时或 出于输入/输出目的而 或编码字节字符串的情况下,才进行Unicode编码/解码)。

解决方法

我正在阅读一个Excel电子表格,其中包含一些£符号。

当我尝试使用xlrd模块读取它时,出现以下错误:

x = table.cell_value(row,col)
x = x.decode("ISO-8859-1")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 0: ordinal not in range(128)

如果我将其重写为x.encode(’utf-8’),它将停止引发错误,但是不幸的是,当我随后将数据写到其他地方(如latin-1)时,£符号都变成了乱码。

我该如何解决这个问题,并正确阅读英镑符号?

-更新-

某些读者建议我根本不需要对其进行解码,或者在需要时可以将其编码为Latin-1。问题在于,我最终需要将数据写入CSV文件,并且它似乎反对原始字符串。

如果我根本不编码或解码数据,那么会发生这种情况(将字符串添加到名为items的数组之后):

for item in items:
    #item = [x.encode('latin-1') for x in item]
    cleancsv.writerow(item)
File "clean_up_barnet.py",line 104,in <module>
 cleancsv.writerow(item)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 43: ordinal not in range(128)

即使我取消注释Latin-1行,我也会遇到相同的错误。