Pythonのencode関数とdecode関数を使って文字をエンコード、デコードする方法

スポンサーリンク

Python の encodedecode メソッドは、与えられたエンコーディングを使って入力文字列をエンコードおよびデコードするために使用されます。

今回は、この2つの関数について詳しく見ていきましょう。

スポンサーリンク

与えられた文字列をエンコードする

すべての文字列オブジェクトが持っている、入力文字列に対する encode() メソッドを使用します。

書式は

input_string.encode(encoding, errors)

これは input_stringencoding を使ってエンコードします。

ここで 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 パラメーターを用いてエンコード/デコード時のエラーを処理する方法についても学びました。

これは、暗号化されたパスワードをローカルにキャッシュし、後で使用するためにそれらをデコードするような、暗号化および復号化の目的で有用です。

タイトルとURLをコピーしました