1

私はフランス人なので、国名の前に良い定冠詞を追加できる小さな関数を作成しようとしています。分音記号で始まるいくつかの国を除いて、私は問題ありません。これが私のコードです:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def article(nomPays):
    voyelles = ['A','E','É','I','O','U','Y']
    if nomPays == 'Mexique':
        return 'du'
    elif nomPays[0] in voyelles:
        return 'de l\''
    elif nomPays[-1] == 'e':#signe négatif pour compter à partir de la dernière lettre
        return 'de la'
    else:
        return 'du'

print article('Érythrée')

Érythrée の代わりに Allemagne を入力すると、動作は正しく、'de l'' が返されます。しかし、エリスレは「デラ」を返します。これは、関数が É という文字を voyelles リストの一部として認識しないことを意味します。

これを解決する理由と方法を誰かに説明してもらえますか?

4

3 に答える 3

3

問題はstr、Python 2 で使用していることです。ここstrで、 は一連のバイトであるため、文字列の最初の文字ではなくnomPays[0]最初のバイトが返されます。シングルバイト エンコーディングではこれは問題になりませんが、UTF-8 などのマルチバイト エンコーディングでは、"Érythrée" の最初のバイトは先頭バイトであり、文字 "É" 全体ではありません。

unicode最初の文字を取得するために使用するように変更する必要があります。

firstChar = unicode(nomPays, 'UTF-8')[0].encode('UTF-8')

実際には、おそらく使いやすいでしょうstartswith

if any(nomPays.startswith(voyelle) for voyelle in voyelles):

または、アプリケーション全体で使用するunicodeか、Python 3 に切り替えると、これらすべてがより適切に処理されます。

于 2012-08-02T10:05:13.673 に答える
3

u前に追加'':

voyelles = [u'A',u'E',u'É',u'I',u'O',u'U',u'Y']
...
print article(u'Érythrée')

例:

>>> voyelles = [u'A',u'E',u'É',u'I',u'O',u'U',u'Y']
>>> s=u'Érythrée'
>>> s[0] in voyelles
True
于 2012-08-02T10:06:58.297 に答える
0

これはバイト文字列であり、Unicode 文字列ではないため、文字列の最初の要素は次のとおりです。

>>> 'Érythrée'[0]
'\xc3'

これは UT8 エンコーディングのためです。

于 2012-08-02T10:07:16.863 に答える