Python の encode と decode メソッドは、与えられたエンコーディングを使って入力文字列をエンコードおよびデコードするために使用されます。
今回は、この2つの関数について詳しく見ていきましょう。
与えられた文字列をエンコードする
すべての文字列オブジェクトが持っている、入力文字列に対する encode() メソッドを使用します。
書式は
input_string.encode(encoding, errors) |
これは input_string を encoding を使ってエンコードします。
ここで errors は、万が一エンコードに失敗した場合に取るべき動作を決定します。
encode()はbytes` のシーケンスになります。
inp_string = 'Hello'
bytes_encoded = inp_string.encode()
print(type(bytes_encoded))
|
この結果、期待通りに <class 'bytes'=""> のオブジェクトが生成されます。
<class 'bytes'>
|
従うべきエンコーディングの種類は encoding パラメータで示される。
文字エンコーディングには様々な種類がありますが、PythonではデフォルトでUTF-8が使用されます。
例として encoding パラメータを見てみましょう。
a = 'This is a simple sentence.'
print('Original string:', a)
# Decodes to utf-8 by defaulta_utf = a.encode()
print('Encoded string:', a_utf)
|
結果は以下の通りです。
Original string: This is a simple sentence.
Encoded string: b'This is a simple sentence.'
|
注:見ての通り、入力文字列をUTF-8形式でエンコードしています。
大きな違いはありませんが、文字列の先頭に b が付いていることがわかります。
これは、文字列がバイトのストリームに変換されることを意味し、どのコンピュータにも保存されている方法です。
これは実際には人間が読めるものではなく、読みやすくするために元の文字列を表現しているだけで、文字列ではなくバイト列であることを示すために b という接頭辞がついています。
エラー処理
エラーには様々な種類がありますが、そのうちのいくつかを以下に示します。
| — | — |
| エラーの種類と動作
| strict | 失敗時に UnicodeDecodeError を発生させるデフォルトの動作です。
|
| ignore | 結果からエンコードできない Unicode を無視します。
|
| replace | エンコードできない Unicode 文字をすべてクエスチョンマーク (?) に置き換えます |。
| backslashreplace | エンコードできないUnicode文字の代わりにバックスラッシュエスケープシーケンス(`gucciuNNNN)を挿入します。
上記の概念を簡単な例で見てみましょう。
ここでは、すべての文字がエンコードできない入力文字列 (ö など) を考えてみます。
a = 'This is a bit möre cömplex sentence.'
print('Original string:', a)
print('Encoding with errors=ignore:', a.encode(encoding='ascii', errors='ignore'))
print('Encoding with errors=replace:', a.encode(encoding='ascii', errors='replace'))
|
結果は以下の通りです。
Original string: This is a möre cömplex sentence.
Encoding with errors=ignore: b'This is a bit mre cmplex sentence.'
Encoding with errors=replace: b'This is a bit m?re c?mplex sentence.'
|
バイト列の復号化
文字列のエンコードと同様に、decode()関数を用いてバイト列のストリームを文字列オブジェクトにデコードすることができます。
書式は以下の通りです。
encoded = input_string.encode()
# Using decode()decoded = encoded.decode(decoding, errors)
|
encode()は文字列をバイトに変換するので、decode()` はその逆を行うだけです。
byte_seq = b'Hello'
decoded_string = byte_seq.decode()
print(type(decoded_string))
print(decoded_string)
|
結果は以下の通りです。
<class 'str'>
Hello |
これは、decode()がバイトをPythonの文字列に変換することを示しています。
encode()と同様に、decodingパラメータはバイト列をデコードする際のエンコードの種類を決定します。
errrors パラメータは、デコードに失敗した場合の振る舞いを表し、 encode() と同じ値を持ちます。
エンコードの重要性
入力文字列のエンコードとデコードは形式に依存するため、エンコード/デコードの際には注意が必要です。
間違った形式を使用すると、間違った出力になり、エラーを発生させる可能性があります。
以下のスニペットは、エンコードとデコードの重要性を示しています。
最初のデコードは、UTF-8形式でエンコードされた入力文字列をデコードしようとするもので、正しくない。
2番目のデコードは、エンコードとデコードの形式が同じであるため、正しい。
a = 'This is a bit möre cömplex sentence.'
print('Original string:', a)
# Encoding in UTF-8encoded_bytes = a.encode('utf-8', 'replace')
# Trying to decode via ASCII, which is incorrectdecoded_incorrect = encoded_bytes.decode('ascii', 'replace')
decoded_correct = encoded_bytes.decode('utf-8', 'replace')
print('Incorrectly Decoded string:', decoded_incorrect)
print('Correctly Decoded string:', decoded_correct)
|
結果は以下の通りです。
Original string: This is a bit möre cömplex sentence.
Incorrectly Decoded string: This is a bit m��re c��mplex sentence.
Correctly Decoded string: This is a bit möre cömplex sentence.
|
まとめ
この記事では、 encode() と decode() メソッドを用いて入力文字列をエンコードし、エンコードされたバイト列をデコードする方法について学びました。
また、 errors パラメーターを用いてエンコード/デコード時のエラーを処理する方法についても学びました。
これは、暗号化されたパスワードをローカルにキャッシュし、後で使用するためにそれらをデコードするような、暗号化および復号化の目的で有用です。