我进行了一些研究,看到了解决方案,但没有一个对我有用。
Python-ASCII编解码器无法解码字节
这对我不起作用。 而且我知道0xe9是é字符。 但是我仍然不知道如何使它工作,这是我的代码
output_lines = ['
']output_string = '
'.join([line.encode("utf-8") for line in output_lines])
这给了我错误ascii codec cant decode byte 0xe9
我尝试解码,尝试替换"é",但似乎也无法正常工作。
您的代码示例无效,并且不会重现该问题; output_lines为空,因此您的循环不会执行任何操作。 您的错误表明您在编码时遇到解码错误,这通常表明您正在尝试对已经编码的数据进行编码。
@MartijnPieters对不起,我没有在示例代码中显示它已满,但已满。 我将其添加到问题中
这仍然不是您的实际output_lines ...当然可以...在尝试创建output_string之前,您可以print output_lines吗?
@JoranBeasley是的,但是output_lines必须更长,所以我把它缩短了
您的数据已经编码,为什么感觉需要再次编码?
不幸的是,@ iqueqiorio您所做的不仅仅只是缩短它...
@JoranBeasley:它重现了问题,我不明白为什么还需要更多?
@MartijnPieters肯定会导致它是编码的急性e ...并且我们应该看到转义码而不是编码的字符...并且很显然,它不会按解决方案中的注释重新处理该问题。
您正在尝试编码字节串:
>>> ''.encode('utf8')
Traceback (most recent call last):
File"", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 20: ordinal not in range(128)
Python试图提供帮助,您只能将Unicode字符串编码为字节,因此要使用默认编码首先隐式解码Python。
解决方案是不对已经编码的数据进行编码,或者如果数据被编码为与所需编码不同的编解码器,则在尝试再次编码之前先使用合适的编解码器进行解码。
如果混合使用unicode和字节串值,则仅解码字节串或仅编码unicode值;尽量避免混淆类型。以下代码将字节字符串解码为unicode:
def ensure_unicode(v):
if isinstance(v, str):
v = v.decode('utf8')
return unicode(v) # convert anything not a string to unicode too
output_string = u'
'.join([ensure_unicode(line) for line in output_lines])
afaik这也表明他正在使用python2x ...因为在3x中它不再尝试隐式转换事物,因此您会得到更清晰的错误(+1 ofc)
将其更改为output_string =
.join([line for line in output_lines])时,@ JoranBeasley和Martijn仍然会出现相同的错误?
@iqueqiorio:您的列表中是否混合使用Unicode和字节字符串?
@MartijnPieters我不认为,所以它很长,有没有办法检查if语句
那么您需要发布导致错误的实际输入...也许将其放入dpaste中...但是由于我们无法复制您的问题...并且您应该发布完整的追溯...
@JoranBeasley这里是全数组gist.github.com/gists的链接
@iqueqiorio:多数民众赞成在不是要旨的链接;不过不要担心,我已经涵盖了。
@MartijnPieters多数民众赞成在一个很好的解决方案:)(我以前不得不使用过的一个...我仍然认为最好有一个格式正确的输入)
@MartijnPieters我遇到相同的错误,并且在行v = v.decode("utf8")上也有错误
当然不是UnicodeDecodeError: ascii codec cannot ...
我得到Unicode Decode: utf8 codec cant decode byte
尝试v.decode("latin1") ...这是真正方便使用的地方,可以提前知道您正在使用的编码; P ...等一下,直到获得JIS编码
@iqueqiorio:是的,因为您从未指定数据编码的编解码器,所以我选择了XML数据的通用默认值。数据来自哪里?您是否还有其他上下文可以让您确定正确的编解码器?
@JoranBeasley:或cp1252;两者都不会失败,但如果编解码器错误,则可能不会产生可读的输出。
"\xe9".decode("utf8") == ERROR,但是在latin1中它是急e(如@MartijnPieters所指出的,它也可以使用" cp1252"进行解码...如果您选择了错误的代码,则会出现问题)
latin1工作正常,我正在从网络上获取数据
@iqueqiorio:然后,Web服务器可以为您提供编解码器,或者XML格式本身可以在元数据中包含编解码器。
@MartijnPieters好的,我在哪里可以找到该信息,他们使用哪种编解码器?
@iqueqiorio:取决于;请参阅使用python和BeautifulSoup从网页上检索链接的示例代码,该示例代码可检索标头中的编解码器。请注意,BeautifulSoup将根据需要在文档本身中找到编解码器信息。
该问题的一个简单示例是:
>>> '\xe9'.encode('utf-8')
Traceback (most recent call last):
File"", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)
\xe9不是ASCII字符,表示您的字符串已经编码。您需要将其解码为python的unicode,然后再次以所需的序列化格式对其进行编码。
由于我不知道您的字符串从何而来,所以我偷看了python编解码器,从西欧挑选了一些东西,然后尝试了一下:
>>> '\xe9'.decode('cp1252')
u'\xe9'
>>> u'\xe9'.encode('utf-8')
'\xc3\xa9'
>>>
如果您确切地知道文件来自哪个编码,那么将是很幸运的。
encode =将unicode字符串转换为字节字符串
decode =将字节字符串转换为unicode
由于您已经有一个字节字符串,因此需要解码以使其成为unicode实例(假设这实际上是您要尝试执行的操作)
output_string = '
'.join(output_lines)
print output_string.decode("latin1") #now this returns unicode
根据您想对行进行的操作,您可以在此处做不同的工作,如果您只想在领事中打印,因为通常领事使用utf8编码,则您不需要自己做为字符串格式不是unicode:
>>> output_string = '
'.join(output_lines)
>>> print output_string
Cream of Wheat (Farina)
但是,如果要写入文件,可以使用codecs模块:
import codecs
f= codecs.open('out_file','w',encoding='utf8')
或只是"
".join(output_lines)
@JoranBeasley是的!对不起,我想念你的答案!