2017-01-22 13 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はこれを単一の文字として認識しないのですか?好きなやり方で、emojisについてどうやって作業しますか?

これは私の端末やREPLに問題がある場合は、iPython 5.1.0でmacOS Sierra端末を使用しています。

+0

☺️は、UTF-16方式を使用して* 2バイトで表されます。 – Maroun

+0

@MarounMaroun確かに、それはまだ独身者の権利ですか? UTF-(8 | 16)はマルチバイト文字をサポートします。 –

+0

@MarounMarounそれはUTF-16で4バイトです。 –

答えて

3

問題はあなたの両方の文字列( '☺️' とは '')各1つのに見えない文字が含まれていることである:

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

文字'\ufe0f'U + FE0F)が

こと Variation Selector-16コードポイントであります

は、前の文字の外観を変更することがあります。それがシンボル、絵文字または絵文字の場合は、U+FE0Fは単色テキストの変形と比較してカラフルなイメージとして表示されます。

文字'\u200d'U + 200D)がZero Width Joinerあります。

+0

これは興味深いことですが、 Python 3では実際にはemojisをUnicodeの観点から正しく扱いません。絵文字は本当にマルチキャラクターのシンボルですか? Emojiのエッジケースを調べるStringクラスのサブクラスを作成する必要があるようです...? –

+0

文字、特に絵文字は、任意の数のコードポイントで構成できます。そのようなグループの専門用語は、* grapheme cluster *です。 [ここにいくつかの例があります。](http://stackoverflow.com/documentation/unicode/6485/characters-can-consist-of-multiple-code-points#t=201701222129426089213)私はSOに関するいくつかの質問があると思いますこれらの書記素クラスターを反復する。 – roeland

+0

'regex'サードパーティモジュールには、文体クラスターと一致する' \ X'があります。 –

関連する問題