そこに注意してください-あなたが「生のutf-8文字列」として私たちに提示したものは、それ以上の違いはありません.
最も重要なのは、最後にあるはずですが、文字列の最終的なデコードにより、中国語で有効なフレーズが明らかになり、Google翻訳で明らかに有効な翻訳が流出します:「1ヒーロービルド」:

2 つ目: 今行っていることはすべてやめて、"Joel on Software" の Unicode に関する古典的な記事を読んでください。実際には - それはあなたを良くします - タイトルがあなたを嘲笑されているように感じさせないでください - それを読んでください.
3 番目に、データの何が問題なのかを見てみましょう。そこにあるのは、「生の utf-8 文字列」ではなく、Python Unicode オブジェクトです。その特定の文字列を ut-8 に正しくエンコードすると、文字どおりに読み取られる文字列 (バイト) オブジェクトが 得'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93'
られs
ます。 ( \
) 文字 - つまり、ここで示したスラッシュは、バイト "0xe6, 0x9c" などを文字としてエンコードするためのエスケープ シーケンスの一部として使用されていません - それらは文字通りそこにあります。それrepr
は'1\\xe6\\x9c\\x8d-\\xe8\\x8b\\xb1\\xe9\\x9b\\x84\\xe9\\x9b\\x86\\xe7\\xbb\\x93'
ただし、それらはエスケープ シーケンスの一部である必要があるため、(バイト) 文字列をデコードs
して Unicode に戻す必要がありますが、特別な「unicode_escape」コーデックを使用すると、Unicode オブジェクトが得られます。リテラルのスラッシュは実際には、前にある 16 進バイト コードのエスケープ文字です。
>>> print s, repr(s)
1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93 '1\\xe6\\x9c\\x8d-\\xe8\\x8b\\xb1\\xe9\\x9b\\x84\\xe9\\x9b\\x86\\xe7\\xbb\\x93'
>>> s1 = s.decode("unicode_escape")
>>> print repr(s1)
u'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93'
その Unicode オブジェクトは Unicode としては意味がありませんが、その raw バイトの内容は utf-8 の実際の最終的な文字列です:
>>> print s1
1æ-è±ééç»
「latin-1」変換は、主に偶然によるものであり、「それはそのようなものである」ためではなく、Unicode オブジェクトのバイトをそのまま通常の (バイト) 文字列に変換するためです。これは「ユニコードの問題」ではありません。Python ユニコード オブジェクトの内部表現の 0 ~ 255 の値がラテン 1 エンコーディングと一致するのは偶然によるものです。したがって、「ラテン 1」でのエンコーディングは「透明な"エンコーディング。規格にはそれを義務付けるものはありません。この文字列を UTF-8 として表示すると(NB、私は utf-8 コンソールで Python インタラクティブ インタープリターを使用しています。ラテン 1 またはその他のエンコーディングを使用した Python プロンプトでは異なる可能性があります)。この場合の意図した文字列:
>>> s2 = s1.encode("latin-1")
>>> print repr(s2)
'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93'
>>> print s2
1服-英雄集结