問題の歴史:
データのエンコード(encoding)とデコード(decoding)は、デバイス、プログラム、プラットフォーム間で情報を交換する必要が生じたことから重要になりました。これらは、異なる方法で文字を解釈し、記憶に保持することができるからです。Pythonでは、3.x以降、文字列(str)とバイト(bytes)の厳密な区別が行われており、文字列はUnicode文字のシーケンスであり、バイトはバイトのシーケンスです。
問題:
ファイル、ネットワーク、外部システムで作業する際、しばしばデータをバイト表現と文字列の間で変換する必要があります。エンコーディングの誤用は、UnicodeEncodeErrorやUnicodeDecodeErrorのエラーを引き起こし、データの整合性を損ない、異なる言語のサポートに問題を引き起こす可能性があります。
解決策:
Pythonでは、文字列をバイトに変換するために.encode()メソッドを使用し、逆に戻すために.decode()メソッドを使用します。最も一般的なエンコーディングは「utf-8」です:
text = "こんにちは、世界!" encoded = text.encode('utf-8') # 文字列をbytesにエンコード print(encoded) # b'\xe3\x81\x93...' decoded = encoded.decode('utf-8') # 文字列に戻す print(decoded) # 'こんにちは、世界!'
主な特徴:
open(..., encoding='utf-8'))。不正なエンコーディングでバイト文字列をデコードしようとするとどうなりますか?
不正なエンコーディングを使用してバイトをデコードしようとすると、エラーが発生するか、正しくない文字列が得られます。例えば:
b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' wrong = b.decode('latin-1') print(wrong) # "こんにちは"ではなく、意味不明な文字列が表示されます
文字列とバイトの文字列を直接+で結合できますか?
いいえ。これによりTypeErrorが発生します。
s = "abc" b = b"def" # s + b # TypeError: can only concatenate str (not "bytes") to str
明示的なエンコーディングを指定せずにテキストファイルを書き込むことはできますか?
はい、できますが、これは悪い慣行と見なされます。なぜなら、OSの設定に依存するシステムのデフォルトエンコーディングが使用され、プラットフォーム間の互換性の問題を引き起こすからです。
プログラマーがWindowsでエンコーディングを指定せずにログファイルを書き込みます。ログはLinuxまたはMacで開かれますが、キリル文字の代わりに意味不明な文字列が表示されます。
利点:
欠点:
プログラマーは常にファイル作成時にencoding='utf-8'を指定します:
with open('log.txt', 'w', encoding='utf-8') as f: f.write('プログラムは正常に終了しました')
利点:
欠点: