Python中的Unicode转义为Emoji

3
我将尝试把转义Unicode转换成表情符号。
例如:
>>> emoji = ""
>>> emoji_text = "\\ud83d\\ude00"
>>> print(emoji)

>>> print(emoji_text)
\ud83d\ude00

将"\ud83d\ude00"替换为要打印的内容。

我发现一个简单的技巧,但并不实用:

>>> import json
>>> json.loads('"\\ud83d\\ude00"')
''

1
可能是如何在Python中使用代理对?的重复问题。 - tripleee
1个回答

5

您的示例与JSON的ensure_ascii=True字符串输出类似,只是需要在字符串中使用双引号。它包含Unicode转义的高/低代理项,用于表示U+FFFF以上的Unicode字符。

请注意,单独使用unicode-escape编解码器无法进行转换。它将创建一个带有代理项的Unicode字符串,这是非法的。您将无法打印或编码该字符串进行序列化。

>>> s = "\\ud83d\\ude00"
>>> s = s.encode('ascii').decode('unicode-escape')
>>> s
'\ud83d\ude00'
>>> print(s)  # UnicodeEncodeError: surrogates not allowed

使用surrogatepass错误处理程序与utf-16编解码器,您可以撤消代理并正确解码字符串。请注意,这也将解码非代理转义代码:

>>> s = "Hello\\u9a6c\\u514b\\ud83d\\ude00"
>>> s.encode('ascii').decode('unicode-escape').encode('utf-16', 'surrogatepass').decode('utf-16')
'Hello马克'

旧解决方案:

以下代码将替换Unicode代理项为其Unicode代码点。如果您有其他非代理项Unicode转义字符,它也会将它们替换为它们的代码点。

import re

def process(m):
    '''process(m) -> Unicode code point

    m is a regular expression match object that has groups below:
     1: high Unicode surrogate 4-digit hex code d800-dbff
     2: low  Unicode surrogate 4-digit hex code dc00-dfff
     3: None
    OR
     1: None
     2: None
     3: Unicode 4-digit hex code 0000-d700,e000-ffff
    '''
    if m.group(3) is None:
        # Construct code point from UTF-16 surrogates
        hi = int(m.group(1),16) & 0x3FF
        lo = int(m.group(2),16) & 0x3FF
        cp = 0x10000 | hi << 10 | lo
    else:
        cp = int(m.group(3),16)
    return chr(cp)

s = "Hello\\u9a6c\\u514b\\ud83d\\ude00"
s = re.sub(r'\\u(d[89ab][0-9a-f]{2})\\u(d[cdef][0-9a-f]{2})|\\u([0-9a-f]{4})',process,s)
print(s)

输出:

Hello马克

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接