我正在尝试将转义的Unicode转换为表情符号。
示例:
>>> emoji = ""
>>> emoji_text = "\\ud83d\\ude00"
>>> print(emoji)
>>> print(emoji_text)
\ud83d\ude00
我想打印
而不是“ \ ud83d \ ude00”我发现了一个简单有效的技巧,但不实用:
>>> import json
>>> json.loads('"\\ud83d\\ude00"')
''
答案 0 :(得分:1)
您的示例与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
以下代码将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马克