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 default a_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-8 encoded_bytes = a.encode( 'utf-8' , 'replace' )
# Trying to decode via ASCII, which is incorrect decoded_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
パラメーターを用いてエンコード/デコード時のエラーを処理する方法についても学びました。
これは、暗号化されたパスワードをローカルにキャッシュし、後で使用するためにそれらをデコードするような、暗号化および復号化の目的で有用です。