問題は、encode
を呼び出していることです str
で オブジェクト。
str
はバイト文字列で、通常はUTF-8のような方法でエンコードされたテキストを表します。 encode
を呼び出すとき その上で、最初にテキストにデコードして戻す必要があるため、テキストを再エンコードできます。デフォルトでは、Pythonはs.decode(sys.getgetdefaultencoding())
を呼び出すことでこれを行います。 、およびgetdefaultencoding()
通常、'ascii'
を返します 。
つまり、UTF-8でエンコードされたテキストを話し、ASCIIであるかのようにデコードしてから、UTF-8で再エンコードします。
一般的な解決策は、decode
を明示的に呼び出すことです。 Pythonにデフォルトを使用させる代わりに、適切なエンコーディングを使用して、encode
します。 結果。
しかし、適切なエンコーディングがすでに必要なものである場合、より簡単な解決策は、.decode('utf-8').encode('utf-8')
をスキップすることです。 UTF-8 str
を使用するだけです UTF-8 str
として すでにそうです。
または、MySQLラッパーにエンコーディングを指定して、unicode
を取得できる機能がある場合もあります。 CHAR
の値 / VARCHAR
/ TEXT
str
の代わりに列 値(たとえば、MySQLdbでは、use_unicode=True
を渡します connect
に 呼び出す、またはcharset='UTF-8'
データベースが古すぎて自動検出できない場合)、それを実行してください。次に、unicode
が作成されます オブジェクト、および.encode('utf-8')
を呼び出すことができます それらに。
一般に、Unicodeの問題に対処する最善の方法は、最後の方法です。すべてをできるだけ早くデコードし、すべての処理をUnicodeで実行してから、できるだけ遅くエンコードします。しかし、いずれにしても、一貫性を保つ必要があります。 str
を呼び出さないでください unicode
の可能性があるもの; str
を連結しないでください unicode
へのリテラル または、1つをそのreplace
に渡します 方法;など。組み合わせて組み合わせると、Pythonはデフォルトのエンコーディングを使用して暗黙的に変換しますが、これはほとんどの場合、必要なものではありません。
ちなみに、これはPython3.xのUnicodeの変更が役立つ多くのことの1つです。まず、str
エンコードされたバイトではなく、Unicodeテキストになりました。さらに重要なのは、持っている エンコードされたバイト(例:bytes
) オブジェクト、encode
を呼び出します AttributeError
が表示されます 再エンコードできるようにサイレントデコードを試みる代わりに。同様に、Unicodeとバイトを組み合わせて一致させようとすると、明らかなTypeError
が得られます。 、場合によっては成功し、他の場合には要求しなかったエンコードまたはデコードに関する不可解なメッセージを表示する暗黙の変換の代わりに。