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')
'葛󠄁'
以上です。