如果列表中的字符串失败并带有变音符号

时间:2012-08-02 10:00:17

标签: python diacritics

由于我是法国人,我正在尝试制作一个可以在国名前添加好文章的小功能。除了少数以变音符号开头的国家外,我没有问题。这是我的代码:

#!/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列表的一部分。

任何人都可以解释我为什么以及如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

问题是您在Python 2中使用str,其中str是一个字节序列,因此nomPays[0]将提供第一个字节字符串,而不是第一个字符。在单字节编码中,这不是问题,但对于像UTF-8这样的多字节编码,“Érythrée”的第一个字节是前导字节,而不是整个字符“É”。 / p>

您需要更改为使用unicode来抓取第一个字符:

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

实际上,使用startswith可能更容易:

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

或者,您可以在整个应用程序中使用unicode,或者切换到Python 3,这样可以更好地处理所有这些。

答案 1 :(得分: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

答案 2 :(得分:0)

这是一个字节字符串,而不是unicode字符串,因此该字符串的第一个元素是:

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

这是因为UT8编码。