晴耕雨読

working in the fields on fine days and reading books on rainy days

[Python] サロゲートペアのバイト列を文字列に変換する方法

Pythonでサロゲートペアのバイト列を文字列に変換する方法について説明します。

文字列から作る場合

UTF-16の文字列に含まれている DB〜DD〜 の部分をサロゲートペアとして解釈させるには、encode の第二引数に「surrogatepass」を指定します。 これを指定することで、サロゲートペアが1つの文字として扱われるようになります。

"\u845B\uDB40\uDD01".encode('utf-16', 'surrogatepass').decode('utf-16')

バイト列から作る場合

バイト列を decode で文字列に変換するときは、バイト列に含まれるサロゲートペアは自動的に扱われます。

b"\x5B\x84\x40\xDB\x01\xDD".decode('utf-16')
b"\x5B\x84\x40\xDB\x01\xDD".decode('utf-16-le')
b"\x84\x5B\xDB\x40\xDD\x01".decode('utf-16-be')

実行結果:

>>> "\u845B\uDB40\uDD01".encode('utf-16', 'surrogatepass').decode('utf-16')
'葛󠄁'
>>> b"\x5B\x84\x40\xDB\x01\xDD".decode('utf-16')
'葛󠄁'
>>> b"\x5B\x84\x40\xDB\x01\xDD".decode('utf-16-le')
'葛󠄁'
>>> b"\x84\x5B\xDB\x40\xDD\x01".decode('utf-16-be')
'葛󠄁'

以上です。

参考資料