あなたは(コメントで)「」「それが私を困惑させていることです。元のアクセントから現在のアクセントにどのように移行しましたか?utf8とlatin1を使用したダブルエンコーディングと言えば、合計3つのエンコーディング(2 utf8)です。 + 1 latin1)?元の状態から現在の状態へのエンコードの順序は何ですか? "" "
Mark Byersの回答の中で、彼は「あなたが持っているのは、誤ってデコードされたUTF-8エンコーディングのようです」と述べています。あなたは彼の答えを受け入れました。しかし、あなたはまだ困惑していますか?OK、これがブローバイブローの説明です:
注:すべての文字列は(暗黙的に)を使用して表示されますrepr()
。unicodedata.name()
内容を確認するために使用されます。そうすれば、コンソールエンコーディングのバリエーションによって、文字列の解釈が混乱することはありません。
初期状態:u1という名前のUnicodeオブジェクトがあります。e-acuteが含まれています:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
u1をUTF-8としてエンコードし、結果に次の名前を付けます。
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
latin1-を使用してsをデコードします-誤って; sは、latin1ではなくutf8を使用してエンコードされました。結果は無意味なゴミです。
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
理解してください:unicode_object.encode('x').decode('y)
x!=yが通常[下記の注を参照]ナンセンスである場合。運が良ければ例外が発生します。運が悪ければ、それは静かにぎこちないものを作ります。また、ジブリッシュを黙って作成することはバグではないことを理解してください。Python(または他の言語)がナンセンスがコミットされたことを検出できる一般的な方法はありません。これは特にlatin1が関係する場合に当てはまります。これは、256個のコードポイントすべてが最初の256個のUnicodeコードポイントと1対1でマップされるため、str_object.decode('latin1')からUnicodeDecodeErrorを取得することができないためです。
もちろん、異常に(異常であることを願っています)gibberish_unicode_object.encode('y').decode('x')
、質問に対するさまざまな回答で提案されているように、そのようなナンセンスを元に戻す必要があるかもしれません。