2017-01-22 90 views
4

我對Python 3如何處理unicode多字節字符有點困惑。下面是用表情符號的例子:在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

☺️使用UTF-16方案由* 2 *字節表示。 – Maroun

+0

@MarounMaroun當然,但它仍然是一個單一的字符? UTF-(8 | 16)支持多字節字符。 –

+0

@MarounMaroun這是UTF-16中的四個字節。 –

回答

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

+0

這很有趣,所以Python 3實際上_does_從unicode的角度正確對待emojis;一個表情符號真的是一個多字符符號?好像我必須創建一個String類的子類,它將查找emoji邊緣情況......? –

+0

字符,特別是表情符號,可以包含任意數量的代碼點。這個組的技術術語是*字形集羣*。 [一些例子在這裏。](http://stackoverflow.com/documentation/unicode/6485/characters-can-consist-of-multiple-code-points#t=201701222129426089213)我想有幾個關於如何如何的問題遍歷這些字形集羣。 – roeland

+0

'正則表達式'第三方模塊具有匹配字形集羣的'\ X'。 –

相關問題