'\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')
'浜'
