Python3表情符号字符为unicode

时间:2015-09-28 15:25:33

标签: python-3.x unicode emoji

我在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是如何工作的,所以任何帮助/更正都会受到高度赞赏。

2 个答案:

答案 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'