如何正确迭代 Python 中的 unicode 字符

Vin*_*una 2 python unicode python-unicode

我想遍历一个字符串并输出所有表情符号。

我正在尝试遍历字符,并根据表情符号列表检查它们。

但是,python 似乎将 unicode 字符拆分为较小的字符,从而破坏了我的代码。例子:

>>> list(u'Test \U0001f60d')
[u'T', u'e', u's', u't', u' ', u'\ud83d', u'\ude0d']
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么 u'\U0001f60d' 会分裂?

或者有什么更好的方法来提取所有表情符号?这是我的原始提取代码:

def get_emojis(text):
  emojis = []
  for character in text:
    if character in EMOJI_SET:
      emojis.append(character)
  return emojis
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 6

Python 3.3 之前的版本在内部使用 UTF-16LE(窄构建)或 UTF-32LE(宽构建)来存储 Unicode,并且由于泄漏的抽象向用户公开了这个细节。UTF-16LE 使用代理对将 U+FFFF 以上的 Unicode 字符表示为两个代码点。使用广泛的 Python 构建或切换到 Python 3.3 或更高版本来解决问题。

处理窄构建的一种方法是匹配代理对:

Python 2.7(窄构建):

>>> s = u'Test \U0001f60d'
>>> len(s)
7
>>> re.findall(u'(?:[\ud800-\udbff][\udc00-\udfff])|.',s)
[u'T', u'e', u's', u't', u' ', u'\U0001f60d']
Run Code Online (Sandbox Code Playgroud)

蟒蛇 3.6:

>>> s = 'Test \U0001f60d'
>>> len(s)
6
>>> list(s)
['T', 'e', 's', 't', ' ', '']
Run Code Online (Sandbox Code Playgroud)