概要
Pythonでの文字列表現をバイト列に変換するにはencode
メソッドを用い、バイト列を文字列に変換するにはdecode
メソッドを用いる。encode
/decode
の引数には文字コードを指定する。
バイト列をPythonのprint
文で出力すると、b'文字列'
で表現され、改行文字などはエスケープコード(\n
など)で表示される。
ASCII文字列
encode/decode
ASCII文字列はencode
/decode
の引数を'ascii'
とする。
1 2 3 4 5 6 7 8 9 10 |
# String->bytesへエンコード s = 'ABC\nDEF' print(s.encode('ascii')) # b'ABC\nDEF' # bytes->Stringへデコード b = b'ABC\nDEF' print(b.decode('ascii')) # ABC # DEF |
ASCIIの場合は引数が'utf-8'
や'shift_jis'
としても結果は同じ。
16進表現
bytes.hexメソッドの引数にバイト列を与えると、その16進表現の文字列が得られる。
1 2 |
print(bytes.hex(b'ABC\nDEF')) # 4142430a444546 |
UTF-8/Shift_JIS
encode/decode
マルチバイト文字の場合、encode
とdecode
で文字コードを整合させる。
1 2 3 4 5 6 7 8 9 10 |
# String->bytesへエンコード s = 'あい\nうえ' print(s.encode('utf-8')) # b'\xe3\x81\x82\xe3\x81\x84\n\xe3\x81\x86\xe3\x81\x88' # bytes->Stringへデコード b = b'\xe3\x81\x82\xe3\x81\x84\n\xe3\x81\x86\xe3\x81\x88' print(b.decode('utf-8')) # あい # うえ |
encode
とdecode
で文字コードが違うと、文字化けするのではなくエラーになる。
1 2 3 4 5 6 |
b = b'\xe3\x81\x82\xe3\x81\x84\n\xe3\x81\x86\xe3\x81\x88' print(b.decode('shift_jis')) # Traceback (most recent call last): # File "bytestring.py", line 5, in <module> # print(b.decode('shift_jis')) # UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x86 in position 9: illegal multibyte sequence |
ただしerrors
引数の設定をデフォルトの'strict’
から変更すると、文字化けした文字列などが返される。
16進表現
マルチバイト文字の16進表現はバイト列の表現のとおりになる。
1 2 |
print(bytes.hex(b'\xe3\x81\x82\xe3\x81\x84\n\xe3\x81\x86\xe3\x81\x88')) # e38182e381840ae38186e38188 |