Python3 表情符号字符作为 unicode

Python3 emoji characters as unicode

我在 python3 中有一个字符串,其中包含表情符号,我想将表情符号视为它们的 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?我可能在想 strings/unicode 如何在 python3 中工作是错误的,所以任何 help/corrections 将不胜感激。

下面是一些代码,可以将映射到两个 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

我以为这会很简单,但结果比我预期的要棘手。特别是因为我第一次没有正确理解问题。

不清楚您为什么需要它,但可以通过以下方式将非 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'