>> emoji_text = "\\ud83d\\ude00" >>> print(emoji) ?-6ren">
gpt4 book ai didi

python - 在 Python 中将 Unicode 转义为 Emoji

转载 作者:行者123 更新时间:2023-12-02 20:06:25 37 4
gpt4 key购买 nike

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

例子:

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

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

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

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

最佳答案

除了字符串中需要双引号外,您的示例接近 JSON 的 ensure_ascii=True 字符串输出。它包含 U+FFFF 以上的 Unicode 字符的 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马克😀

关于python - 在 Python 中将 Unicode 转义为 Emoji,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559885/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com