エンコードとデコードのメモ
参考
エンコードとデコード
- コンピュータが分かるように変換する → エンコード
- 人が分かるように変換する → デコード
デフォルトのエンコードを確認してみる。
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 進数 )
まだまだ深そうですが一旦ここまでとします。
ディスカッション
コメント一覧
まだ、コメントがありません