我在 python 3 中有一个字符串,其中有几个 unicode 表示,例如:
t = 'R\\u00f3is\\u00edn'
我想转换 t 以便在打印时它具有正确的表示形式,即:
>>> print(t)
Róisín
但是我只是取回了原始字符串。我试过 re.sub 和其他一些,但我似乎无法找到一种方法来更改这些字符而不必遍历每个字符。 最简单的方法是什么?
最佳答案
您想使用内置编解码器 unicode_escape
。
如果t
已经是一个bytes
(8位字符串),就这么简单:
>>> print(t.decode('unicode_escape'))
Róisín
如果t
已经被解码成Unicode,你可以将它编码回bytes
,然后用这种方式解码
。如果您确定所有 Unicode 字符都已转义,那么使用什么编解码器进行编码实际上并不重要。否则,您可以尝试取回原始字节字符串,但它更简单,也可能更安全,只强制对任何未编码的字符进行编码,然后它们将与已编码的字符一起解码:
>>> print(t.encode('unicode_escape').decode('unicode_escape')
Róisín
如果你以后想知道如何用正则表达式做这种事情,请注意 sub
允许您为 repl
传递函数而不是模式。并且你可以通过调用int(hexstring, 16)
将任何十六进制字符串转换成一个整数,并用chr
将任何整数转换成相应的Unicode字符(注意这是一个在 Python 2 中有点不同——你需要 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
编解码器实际上处理\U
、\x
、\X
、八进制(\066
) 和特殊字符 (\n
) 序列以及 \u
,它实现了只读取适当最大值的正确规则位数(\u
为 4,\U
为 8,等等,因此 r'\\u22222'
解码为 '∢2'
而不是 '𢈢'
),可能还有更多我没有想到的东西。但这应该会给你灵感。
关于python - 从 python 3 中的字符串中删除 unicode 表示的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793973/