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')

如果我输入 Allemagne 而不是 Érythrée,则行为是正确的:它返回“de l”。但是 Érythrée 返回“de la”。这意味着我的函数无法将字符 É 识别为 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 回答