由于我是法国人,我正在尝试制作一个可以在国名前添加好文章的小功能。除了少数以变音符号开头的国家外,我没有问题。这是我的代码:
#!/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列表的一部分。
任何人都可以解释我为什么以及如何解决这个问题?
答案 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编码。