常にユニコードからバイトにエンコードします。
この方向では、エンコーディングを選択できます。
>>> 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」デコーダー†が選択され、エンコーダー内でデコードエラーが発生します。Unicode
Decode
Error
encode
unicode
str
unicode
実際、Python 3ではメソッドstr.decode
とbytes.encode
も、存在しません。彼らの連れ去りは、この一般的な混乱を避けるための[物議を醸す]試みでした。
† ...またはコーディングに関するsys.getdefaultencoding()
言及。通常これは「アスキー」です