我在python3中有一个字符串,里面有emojis,我想将emojis视为他们的unicode表示。我需要以这种格式对表情符号进行一些操作。
s = ' hello'
将每个表情符号视为自己的角色,len(s) == 9
&& s[0] ==
我想更改字符串的格式,使其处于unicode点,以便
s = ' hello'
u = to_unicode(s) # Some function to change the format.
print(u) # '\ud83d\ude2c \ud83d\ude0e hello'
u[0] == '\ud83d' and u[1] == '\ude2c'
len(u) == 11
有关创建函数to_unicode
的任何想法,它将采用s并将其更改为u?我可能会想到python3中的字符串/ unicode是如何工作的,所以任何帮助/更正都会受到高度赞赏。
答案 0 :(得分:4)
这里有一些代码可以将任何字符映射为两个UTF-16字并将其转换为十六进制序列。
s = '\U0001f62c \U0001f60e hello'
def pairup(b):
return [(b[i] << 8 | b[i+1]) for i in range(0, len(b), 2)]
def utf16(c):
e = c.encode('utf_16_be')
return ''.join(chr(x) for x in pairup(e))
u = ''.join(utf16(c) for c in s)
print(repr(u))
print(u[0] == '\ud83d' and u[1] == '\ude2c')
print(len(u))
'\ud83d\ude2c \ud83d\ude0e hello'
True
11
我认为这将是一个明智的选择,但结果却比我想象的更棘手。特别是因为我第一次没有正确理解这个问题。
答案 1 :(得分:1)
目前尚不清楚为什么需要它,但这里是你如何将非BMP Unicode字符表示为代理对:
#!/usr/bin/env python3
import re
def as_surrogates(astral):
b = astral.group().encode('utf-16be')
return ''.join([b[i:i+2].decode('utf-16be', 'surrogatepass')
for i in range(0, len(b), 2)])
s = '\U0001f62c \U0001f60e hello'
u = re.sub(r'[^\u0000-\uFFFF]+', as_surrogates, s)
print(ascii(u))
assert u.encode('utf-16', 'surrogatepass').decode('utf-16') == s
'\ud83d\ude2c \ud83d\ude0e hello'