如何解码 python 中的部分转义 unicode 字符串(混合 unicode 和转义 unicode)?

How to decode partially escaped unicode string in python (mixed unicode and escaped unicode)?

给定以下字符串:

str = "\u20ac €"

如何解码成€ €

使用 str.encode("utf-8").decode("unicode-escape") returns € â\x82¬

(澄清一下,我正在寻找一个通用的解决方案来解码 unicode 和转义字符的任何组合)

如果这始终是字符串的格式,请使用 .split:

string = "\u20ac €"
escaped_unicode, non_escaped_unicode = string.split()
output = '{} {}'.format(escaped_unicode.encode("utf-8").decode("unicode-escape"), non_escaped_unicode)
print(output)
# € €

否则,我们需要发挥更多创意。我认为最通用的解决方案是仍然使用 split,但随后使用正则表达式来确定我们是否需要处理转义的 unicode( 假设输入足够健全,不会混合 unicode 和转义的 unicode在同一个“单词”中)

import re

string = "ac ab \u20ac cdef €"
regex = re.compile(r'([\u0000-\u007F]+)')
output = []
for word in string.split():
    match = regex.search(word)
    if match:
        try:
            output.append(match[0].encode("utf-8").decode("unicode-escape"))
        except UnicodeDecodeError:
            # assuming the string contained a literal \u or anything else
            # that decode("unicode-escape") could not handle, so adding to output as is
            output.append(word)
    else:
        output.append(word)
print(' '.join(output))
# ac ab € cdef €

一个简单快速的解决方案是使用re.sub匹配\u和恰好四个十六进制数字,并将这些数字转换为Unicode代码点:

import re

s = r"blah bl\uah \u20ac € b\u20aclah\u12blah blah"
print(s)

s = re.sub(r'\u([0-9a-fA-F]{4})',lambda m: chr(int(m.group(1),16)),s)
print(s)

输出:

blah bl\uah \u20ac € b\u20aclah\u12blah blah
blah bl\uah € € b€lah\u12blah blah