半角英数字をUTF-8でencode
>>> s = "aiueo012" >>> b = s.encode("utf-8") >>> b >>> b'aiueo012'
これをdecodeする
>>> b.decode("utf-8") 'aiueo012' >>> b.decode("iso-2022-jp") 'aiueo012'
半角英数字をutf-8でエンコードしたものは、iso-2022-jpでデコードしても問題ない
半角英数字 + 日本語文字をUTF-8でencode
>>> ss = "aiueo012あいうkakikukeko" >>> bb = ss.encode("utf-8") >>> bb b'aiueo012\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86kakikukeko'
日本語は1文字3バイトの16進数に変換されます。
これをUTF-8とiso-2022-jpでdecodeしてみます。
>>> bb.decode("utf-8") 'aiueo012あいうkakikukeko' >>> bb.decode("iso-2022-jp") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'iso2022_jp' codec can't decode byte 0xe3 in position 8: illegal multibyte sequence
当然、UTF-8でdecodeすると元の文字列に戻ります
iso-2022-jpでdecodeしようとすると、0xe3がdecodeできなくてUnicodeDecodeErrorが発生します
>>> bb.decode("iso-2022-jp", "ignore") 'aiueo012kakikukeko'
"ignore"オプションをつけてdecodeすると、デコード不可な文字は無視して無理やりdecodeしてくれます。
今回の場合では、結果として半角英数字のみを取り出すことができました。
半角英数字 + 日本語文字をiso-2022-jpでencode
>>> bb = ss.encode("iso-2022-jp") >>> bb b'aiueo012\x1b$B$"$$$&\x1b(Bkakikukeko' >>> bb.decode("iso-2022-jp") 'aiueo012あいうkakikukeko' >>> bb.decode("utf-8") 'aiueo012\x1b$B$"$$$&\x1b(Bkakikukeko' >>> bb.decode("utf-8", "ignore") 'aiueo012\x1b$B$"$$$&\x1b(Bkakikukeko'
iso-2022-jpでencodeしたものは、UTF-8でdecodeすると、すべて半角英数字と記号に直されるようです