常にユニコードからバイトにエンコードします。
この方向では、エンコーディングを選択できます。
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
もう1つの方法は、バイトからユニコードにデコードすることです。
この方向では、エンコーディングが何であるかを知る必要があります。
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
この点は十分に強調することはできません。ユニコード「モグラたたき」の再生を避けたい場合は、データレベルで何が起こっているのかを理解することが重要です。ここでは別の方法で説明されています:
- Unicodeオブジェクトは既にデコードされているため、呼び出したくない
decode。
- バイト文字列オブジェクトは既にエンコードされているため、呼び出したくない
encode。
ここで.encode、バイト文字列を確認すると、Python 2は最初にそれを暗黙的にテキスト(unicodeオブジェクト)に変換しようとします。同様.decodeに、Unicode文字列を確認すると、Python 2は暗黙的にそれをバイト(strオブジェクト)に変換しようとします。
これらの暗黙の変換が、を呼び出したときに取得できる理由です。これは、エンコーディングが通常、タイプのパラメータを受け入れるためです。パラメータを受け取ると、別のエンコーディングで再エンコードする前に、タイプのオブジェクトに暗黙的にデコードされます。この変換では、デフォルトの「ascii」デコーダー†が選択され、エンコーダー内でデコードエラーが発生します。UnicodeDecodeErrorencodeunicodestrunicode
実際、Python 3ではメソッドstr.decodeとbytes.encodeも、存在しません。彼らの連れ去りは、この一般的な混乱を避けるための[物議を醸す]試みでした。
† ...またはコーディングに関するsys.getdefaultencoding()言及。通常これは「アスキー」です