在 Python 中将 Unicode 转义为 Emoji

Hen*_*yKo 3 python unicode emoji

我正在尝试将转义 Unicode 转换为表情符号。

例子:

>>> emoji = ""
>>> emoji_text = "\\ud83d\\ude00"
>>> print(emoji)

>>> print(emoji_text)
\ud83d\ude00
Run Code Online (Sandbox Code Playgroud)

我想打印而不是“\ud83d\ude00”

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

>>> import json
>>> json.loads('"\\ud83d\\ude00"')
''
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 5

ensure_ascii=True除了字符串中需要双引号之外,您的示例与 JSON 的字符串输出很接近。它包含 U+FFFF 以上 Unicode 字符的 Unicode 转义高/低代理项。

\n

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

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

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

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

旧的解决方案:

\n

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

\n
import re\n\ndef process(m):\n    \'\'\'process(m) -> Unicode code point\n\n    m is a regular expression match object that has groups below:\n     1: high Unicode surrogate 4-digit hex code d800-dbff\n     2: low  Unicode surrogate 4-digit hex code dc00-dfff\n     3: None\n    OR\n     1: None\n     2: None\n     3: Unicode 4-digit hex code 0000-d700,e000-ffff\n    \'\'\'\n    if m.group(3) is None:\n        # Construct code point from UTF-16 surrogates\n        hi = int(m.group(1),16) & 0x3FF\n        lo = int(m.group(2),16) & 0x3FF\n        cp = 0x10000 | hi << 10 | lo\n    else:\n        cp = int(m.group(3),16)\n    return chr(cp)\n\ns = "Hello\\\\u9a6c\\\\u514b\\\\ud83d\\\\ude00"\ns = re.sub(r\'\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[cdef][0-9a-f]{2})|\\\\u([0-9a-f]{4})\',process,s)\nprint(s)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Hello\xe9\xa9\xac\xe5\x85\x8b\n
Run Code Online (Sandbox Code Playgroud)\n