1. ホーム
  2. python

[解決済み] アスキーコーデックがバイト0xe9をデコードできない

2022-02-08 19:10:50

質問

いろいろ調べたり、解決策を見たりしましたが、私にはどれもうまくいきませんでした。

Python - 'ascii'コーデックがバイトをデコードできない

これは私の場合、うまくいきませんでした。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

そして、デコードを試み、"é"を置換しようとしましたが、これもうまくいかないようです。

どのように解決するのですか?

バイト列をエンコードしようとしています。

>>> '<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は役に立とうとしているのです、あなたがエンコードできるのは ユニコード 文字列をバイトに変換するため、Pythonはまず暗黙のうちに デコード デフォルトのエンコーディングを使用します。

解決策としては エンコードしない または、必要なコーデックとは異なるコーデックでエンコードされている場合は、適切なコーデックでデコードしてから再度エンコードを試みます。

unicodeとbytestringの値が混在している場合は、bytestringだけをデコードするか、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'\n'.join([ensure_unicode(line) for line in output_lines])