【问题标题】:Python3 emoji characters as unicodePython3 表情符号字符作为 unicode
【发布时间】:2018-09-10 18:40:19
【问题描述】:

我在 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 有什么想法吗?我可能正在考虑字符串/unicode 在 python3 中的工作方式错误,因此任何帮助/更正将不胜感激。

【问题讨论】:

  • 称它为as_surrogates() 而不是to_unicode() 因为'\U0001f60e' == '????' 即'????' 已经是一个单一的Unicode 代码点。 '\ud83d\ude0e' 是一个代理对,它是表示相同 Unicode 字符的一种不足方式。如果某些 API 不理解非 BMP Unicode 字符(例如许多表情符号),您可能需要它。通常,您想要相反,即将代理对转换为相应的 Unicode 字符:'\ud83d\ude0e'.encode('utf-16', 'surrogatepass').decode('utf-16') == '\U0001f60e'
  • 是的,to_unicode() 具有误导性。 as_surrogates() 对 unicode 类型之间的这种转换更有意义。

标签: python-3.x unicode emoji


【解决方案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'

【讨论】:

    【解决方案2】:

    这里有一些代码可以将任何字符映射为两个 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
    

    我原以为这会是一件轻而易举的事,但结果却比我预想的要复杂。特别是因为我第一次没有正确理解这个问题。

    【讨论】:

    • 感谢您的回复!像魅力一样工作
    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2016-02-07
    • 2019-05-20
    • 2016-03-22
    相关资源
    最近更新 更多