常にUnicodeからバイトにエンコードします。
この方向では、エンコーディングを選択できます。
>>> 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の「モグラたたき」を避けたい場合は、データレベルで何が起こっているのかを理解することが重要です。ここでは別の方法で説明します。
- Unicodeオブジェクトはすでにデコードされているので、呼び出す必要はありません
decode
。
- バイトストリングオブジェクトはすでにエンコードされているので、呼び出す必要はありません
encode
。
さて、バイト文字列を見ると、Python 2は最初にそれを暗黙的にテキスト(オブジェクト).encode
に変換しようとします。unicode
同様に、Unicode文字列を見ると、Python 2は暗黙的にそれをバイト(オブジェクト) .decode
に変換しようとします。str
これらの暗黙の変換は、を呼び出したときに取得できる理由です。これは、エンコーディングが通常、タイプのパラメータを受け入れるためです。パラメータを受け取ると、別のエンコーディングで再エンコードする前に、あるタイプのオブジェクトに暗黙的にデコードされます。この変換では、デフォルトの「ASCII」デコーダー†</ sup>が選択され、エンコーダー内のデコードエラーが発生します。Unicode
Decode
Error
encode
unicode
str
unicode
実際、Python 3にはメソッドがstr.decode
ありbytes.encode
、存在すらしていません。それらの除去は、この一般的な混乱を回避するための[物議を醸す]試みでした。
†</sup> ...またはコーディングsys.getdefaultencoding()
で言及されているもの。通常、これは「ASCII」です。