組み込みのコーデックを使用しますunicode_escape
。
t
がすでにbytes
(8ビット文字列)の場合は、次のように簡単です。
>>> print(t.decode('unicode_escape'))
Róisín
t
すでにUnicodeにデコードされている場合は、この方法でエンコードしてからbytes
に戻すことができますdecode
。すべてのUnicode文字がエスケープされていることが確実な場合は、実際には、エンコードに使用するコーデックは関係ありません。それ以外の場合は、元のバイト文字列を取り戻そうとすることもできますが、エンコードされていない文字を強制的にエンコードすると、すでにエンコードされている文字と一緒にデコードされる方が簡単で、おそらく安全です。
>>> print(t.encode('unicode_escape').decode('unicode_escape')
Róisín
将来、正規表現を使用してこの種のことを行う方法を知りたい場合sub
は、のパターンの代わりに関数を渡すことができることに注意してくださいrepl
。また、を呼び出すことint(hexstring, 16)
で任意の16進文字列を整数に変換し、を使用して任意の整数を対応するUnicode文字に変換できますchr
(これはPython 2とは異なる1ビットであることに注意してくださいunichr
。代わりに必要です)。それで:
>>> re.sub(r'(\\u[0-9A-Fa-f]+)', lambda matchobj: chr(int(matchobj.group(0)[2:], 16)), t)
Róisín
または、もう少し明確にします。
>>> def unescapematch(matchobj):
... escapesequence = matchobj.group(0)
... digits = escapesequence[2:]
... ordinal = int(digits, 16)
... char = chr(ordinal)
... return char
>>> re.sub(r'(\\u[0-9A-Fa-f]+)', unescapematch, t)
Róisín
コーデックは、unicode_escape
実際には、、、 8進数()、および特殊文字()シーケンスだけでなく、を処理し、適切な最大桁数(4は4、8はなど)のみを読み取るための適切なルールを実装します。 )ではなく、そしておそらく私が考えていなかったより多くのこと。しかし、これはあなたにアイデアを与えるはずです。\U
\x
\X
\066
\n
\u
\u
\U
r'\\u22222'
'∢2'
''