'\xe6\xb5\x9c'
のようなバイト文字列を変換する方法についての解説です。
>>> text = b'\xe6\xb5\x9c' >>> text.decode('utf8') '浜'
通常、上記のようにバイトを表す「b」の接頭辞がついていれば、そのままdecodeをかければ変換できるのですが、「b」の接頭辞がついていない、str型の文字列が変数に入っているときに変換する方法です。
方法としては2段階あり、バイトの文字列をバイトに変換('\xe6\xb5\x9c' → b'\xe6\xb5\x9c')した後に、デコードをする、というものです。
- Python 3.9.9 で確認
- 文字のエンコーディングはUTF-8を想定
1. バイト文字列をバイトに変換する
text = '\xe6\xb5\x9c'
のような文字列があった際にこれをデコードすると、エラーが出てしまいます。
>>> text = '\xe6\xb5\x9c' >>> text.decode('utf8') Traceback (most recent call last): File "", line 1, in AttributeError: 'str' object has no attribute 'decode'
これは、'\xe6\xb5\x9c' がstr型であるため、 b'\xe6\xb5\x9c' というバイト型にまず直す必要があります。
パターン1:latin-1を使ってencodeをかける
>>> text = '\xe6\xb5\x9c' >>> text.encode('latin-1') b'\xe6\xb5\x9c'
Latin-1の文字コードは0x00-0xffの範囲のすべてのコードポイントを同じ値を持つバイトにエンコードします。そのため、バイト文字列をそのままにバイト形式に変換することができます。
パターン2:structを使って関数を自作する
import struct def convert_string_to_bytes(string): bytes = b'' for i in string: bytes += struct.pack("B", ord(i)) return bytes
convert_string_to_bytesという関数を自作し、1文字ずつバイトとみなしていく、というものです。
>>> text = '\xe6\xb5\x9c' >>> print(convert_string_to_bytes(text)) b'\xe6\xb5\x9c'
2. byte型をデコードする
1st stepでstr型からbyte型に変換したので、あとは、これをデコードします。
>>> text = '\xe6\xb5\x9c' >>> text_byte = text.encode('latin-1') >>> text_byte.decode('utf8') '浜'