0

Python でのキリル文字の比較に問題があります。ここに小さなテストケースがあります%

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def convert(text):
    result = []
    for i in xrange(len(text)):
        if text[i].lower() == 'й':
            result.append('q')
    print result

if __name__ == '__main__':
    convert('йцукенг')

最初の文字が条件の文字と等しくなければならないことは明らかです。しかし、条件は失敗し、結果は空です。

また、文字列全体 (テキスト) を印刷しようとするとうまくいきますが、文字 (text[2] など) だけを印刷しようとすると、「?」が表示されます。出力で。

問題はエンコーディングにあると確信していますが、どうすれば個別の文字を正しく比較できますか?

4

2 に答える 2

3

文字ではなく、UTF-8 文字列のバイトをループしているため、この動作が発生しています。違いの例を次に示します。

>>> 'й'               # note that this is two bytes
'\xd0\xb9'
>>> 'йцукенг'[0]      # but when you loop you are looking at a single byte
'\xd0'
>>> len('йцукенг')    # 7 characters, but 14 bytes
14

これが、mVChr の回答のように、文字のチェックに Unicode を使用する必要がある理由です。

これを行う最も簡単な方法は、すべてのコードをまったく同じままにして、uすべての文字列リテラル (u'йцукенг'およびu'й') にプレフィックスを追加することです。

于 2012-06-11T23:40:08.200 に答える
1

Python 2.X を使用していると仮定すると、Unicode 文字列を使用する必要があります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def convert(text):
    result = []
    for i in xrange(len(text)):
        if text[i].lower() == unicode('й', 'utf8'):
            result.append('q')
    print result

if __name__ == '__main__':
    convert(unicode('йцукенг', 'utf8'))

u'йцукенг'または、 と の生の Unicode 文字列を単純に入力することもできます。u'й'

于 2012-06-11T23:36:37.753 に答える