Python 3中使用Unicode多字节字符的子串选择

时间:2017-01-22 13:36:28

标签: python python-3.x unicode emoji

我对Python 3如何处理unicode多字节字符感到有些困惑。这是表情符号的一个例子:

In [1]: print('☺️')
☺️

In [2]: print(len('☺️'))
2

In [3]: print('☺️'[0])
☺

In [4]: print('☺️'[1])
️

In [5]: print(len('‍'))
4

由于我正在处理一个处理表情符号的小型业余爱好项目,这对我来说会产生一些问题,因为我更愿意将表情符号作为单个字符串处理,而不是将它们视为多字符串,因为Python 3似乎做。为什么Python 3不会将其视为单个角色,我如何以我喜欢的方式使用表情符号?

如果我的终端或REPL出现问题,我将使用带有iPython 5.1.0的macOS Sierra终端。

1 个答案:

答案 0 :(得分:3)

问题是你的两个字符串('☺️''')每个都包含一个不可见的字符:

>>> '☺️'[0]
'☺'
>>> '☺️'[1]
'️'
>>> '☺️'[1].encode('unicode_escape')
b'\\ufe0f'                             # !!!!!!!!!!
>>> '‍'[0]
''
>>> '‍'[1]
''
>>> '‍'[2]
'\u200d'                               # !!!!!!!!!!
>>> '‍'[3]
''

字符'\ufe0f' U + FE0F )是Variation Selector-16代码点

  

可能会改变前一个字符的外观。如果这是一个符号,dingbat或表情符号,U+FE0F强制它与单色文本变体相比呈现为彩色图像。

字符'\u200d' U + 200D )是Zero Width Joiner