str と bytes

python 3 からは、文字列(str 型)は UNICODE として扱われ、日本語なども扱えます。 'abc' も 3 文字だし、'あいう' も 3 文字です。そりゃそうですよね。python プログラム中に書くときは、

'あいう'

などと書きます。

ただ、実際にファイルなどに書き込む際は、文字コード(文字符号化方式, encoding)を決めて byte 列に変換して出力します。 UTF-8 とか UTF-16 とか Shift_JIS とか、いろいろあります。 ASCII は、アルファベットや数字は扱えますが、「ひらがな」や「漢字」は扱えない。

UTF-8 は、アルファベットなどについて ASCII と互換性をもたせるように 1-byte で表現し、 「ひらがな」などは複数 bytes 使って表現します。

  • str から bytes の変換は encode() で可能。encoding を指定できるが、省略時は utf-8 が利用される
  • bytes から str への変換は decode() で可能。encoding を指定できるが、省略時は utf-8 が利用される
  • str(bytes, encoding) でも bytes から str への変換可能
s = 'abc'
print(s)        # abc
b = s.encode()
print(b)        # b'abc'
print(str(b,'utf-8'))    # abc
print(b.decode('utf-8')) # abc

s = 'あいう'
print(s)        # あいう
b = s.encode()
print(b)        # b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
print(str(b, 'utf-8'))   # あいう
print(b.decode('utf-8')) # あいう

ちなみに、bytes の場合、print の際 b'abc' のように表示され、同様に、 プログラム中に bytes の値を直接表記する際も b'abc' のように書くことができます。