'\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')
'浜'
Pythonエンコーディング