エンコードとデコードのメモ

参考

エンコードとデコード

  • コンピュータが分かるように変換する → エンコード
  • 人が分かるように変換する → デコード

デフォルトのエンコードを確認してみる。

import sys
print(sys.getdefaultencoding()) # utf-8

エンコードしてデコードで戻してみる。

print("---------- default_hoge ----------")
default_hoge = 'あいうえお'
print(type(default_hoge)) # <class 'str'>
print(default_hoge) # あいうえお

print("---------- utf8_hoge ----------")
utf8_hoge = default_hoge.encode() # defaultencoding の utf-8 で encode される。'utf-8'を () 内に指定してもよい。
print(type(utf8_hoge)) # <class 'bytes'>
print(utf8_hoge) # b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'

print("---------- decoded_utf8_hoge ----------")
decoded_utf8_hoge = utf8_hoge.decode() # 上記同様で'utf-8'を () 内に指定してもよい。
print(type(decoded_utf8_hoge)) # <class 'str'>
print(decoded_utf8_hoge) # あいうえお

print("---------- cp932_hoge ----------")
cp932_hoge = default_hoge.encode('cp932')
print(type(cp932_hoge)) # <class 'bytes'>
print(cp932_hoge) # b'\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8'

print("---------- decoded_cp932_hoge ----------")
decoded_cp932_hoge = cp932_hoge.decode('cp932')
print(type(decoded_cp932_hoge)) # <class 'str'>
print(decoded_cp932_hoge) # あいうえお

cp932 を指定してエンコードしたのを utf-8 を指定してデコードしてみる。

print("---------- decode_error_1 ----------")
cp932_hoge = default_hoge.encode('cp932')
cp932_hoge.decode('utf-8') # UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte

utf-8 を指定してエンコードしたのを cp932 を指定してデコードしてみる。

print("---------- decode_error_2 ----------")
utf8_hoge = default_hoge.encode('utf-8') # UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 8: illegal multibyte sequence
utf8_hoge.decode('cp932')

utf-8 とか cp932 とか

人とコンピュータが相互に理解できるようにする為には、対応表を二つ用意する必要があるようです。
それが「符号化文字集合」と「文字符号化方式」との事です。
そして utf-8 や cp932 は「文字符号化方式」の一つの方式のようです。

符号化文字集合

  • 「文字集合」と「コードポイント」の対応表の事。
  • 種類には、ASCII, ISO/IEC 6429, Unicode とかがある。
  • 下記のようなイメージ。
文字集合 コードポイント(10 進数)
12354
12356
12358

文字符号化方式

  • 「コードポイント」と「バイト列」の対応表の事。
  • 種類には、UTF-8, Shift-JIS EUC-JP とかがある。
  • 下記のようなイメージ。
コードポイント(10 進数) バイト列
12354 b'\xe3\x81\x82'
12356 b'\xe3\x81\x84'
12358 b'\xe3\x81\x86'

符号化文字集合と文字符号化方式

前述する表を合わせると次のような表になる。

文字集合 コードポイント(10 進数) バイト列
12354 b'\xe3\x81\x82'
12356 b'\xe3\x81\x84'
12358 b'\xe3\x81\x86'

コードで確認してみる

ord  を使って「文字列」を「コードポイント」に変換してみる。

print(ord('あ')) # 12354

chr「コードポイント」を「文字列」に変換してみる。

print(chr(12354)) # あ

10 進数以外にも変換してみる

ord で変換すると 10 進数になるようなので、他の「x 進数」も試してみる。

# 0o 0x 0b は、プリフィックス。
print(ord('あ')) # 12354 ( 10 進数 )
print(oct(ord('あ'))) # 0o30102 ( 8 進数 )
print(hex(ord('あ'))) # 0x3042 ( 16 進数 )
print(bin(ord('あ'))) # 0b11000001000010 ( 2 進数 )

まだまだ深そうですが一旦ここまでとします。

YouTube