我对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终端。
答案 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。