ascii 编解码器无法解码字节 0xe9

ascii codec cant decode byte 0xe9

我做了一些研究并看到了解决方案,但 none 对我有用。

Python - 'ascii' codec can't decode byte

这对我不起作用。我知道 0xe9 是 é 字符。但我仍然不知道如何让它工作,这是我的代码

output_lines = ['<menu>', '<day name="monday">', '<meal name="BREAKFAST">', '<counter name="Entreé">', '<dish>', '<name icon1="Vegan" icon2="Mindful Item">', 'Cream of Wheat (Farina)','</name>', '</dish>', '</counter >', '</meal >', '</day >', '</menu >']
output_string = '\n'.join([line.encode("utf-8") for line in output_lines])

这给我错误 ascii codec cant decode byte 0xe9

我试过解码,我试过替换“é”,但似乎也无法正常工作。

encode = 将 unicode 字符串转换为 bytestring

decode = 将字节串转换为 unicode

因为你已经有了一个字节串,你需要解码使它成为一个 unicode 实例(假设这实际上是你想要做的)

output_string = '\n'.join(output_lines)
print output_string.decode("latin1")  #now this returns unicode

您正在尝试对字节串进行编码:

>>> '<counter name="Entreé">'.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 20: ordinal not in range(128)

Python 试图提供帮助,您只能将 Unicode 字符串编码为字节,因此首先隐式编码 Python 解码,使用默认编码。

解决方案是不编码已经编码的数据,或者在尝试再次编码之前先使用合适的编解码器解码,如果数据被编码为不同的编解码器你需要什么。

如果您混合使用 unicode 和 bytestring 值,则只解码 bytestrings 或只编码 unicode 值;尽量避免混合类型。以下首先将字节字符串解码为 un​​icode:

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'\n'.join([ensure_unicode(line) for line in output_lines])

根据你想用你的线条做什么,你可以在这里做不同的工作,如果你只是想在领事中打印,因为通常领事使用 utf8 编码你不需要通过你的self 因为你的字符串格式不是 unicode:

>>> output_string = '\n'.join(output_lines)
>>> print output_string
<menu>
<day name="monday">
<meal name="BREAKFAST">
<counter name="Entreé">
<dish>
<name icon1="Vegan" icon2="Mindful Item">
Cream of Wheat (Farina)
</name>
</dish>
</counter >
</meal >
</day >
</menu > 

但是如果你想写入文件,你可以使用 codecs 模块:

import codecs
f= codecs.open('out_file','w',encoding='utf8')

问题的一个简单例子是:

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

\xe9 不是 ascii 字符,这意味着您的字符串已经编码。你需要把它解码成python的unicode,然后再编码成你想要的序列化格式。

因为我不知道你的字符串是从哪里来的,所以我只是偷看了一眼python codecs,从西欧挑选了一些东西试了一下:

>>> '\xe9'.decode('cp1252')
u'\xe9'
>>> u'\xe9'.encode('utf-8')
'\xc3\xa9'
>>> 

如果您确切知道文件来自哪种编码,那么您会很幸运。