【问题标题】:if string in list fails with diacritics如果列表中的字符串因变音符号而失败
【发布时间】:2012-08-02 10:00:16
【问题描述】:

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

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

谁能解释我为什么以及如何解决这个问题?

【问题讨论】:

标签: python diacritics


【解决方案1】:

问题是您在 Python 2 中使用 str,其中 str 是字节序列,因此 nomPays[0] 将给出字符串的第一个 byte,而不是第一个字符。在单字节编码中这不是问题,但是对于像 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,这一切都得到了更好的处理。

【讨论】:

  • 非常清晰准确的答案。现在我将使用startwith,但我会考虑切换到Python 3。还要感谢@martjin 的阅读建议(第一个已经完成)。
【解决方案2】:

''之前添加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

【讨论】:

    【解决方案3】:

    是字节串,不是unicode串,所以字符串的第一个元素是:

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

    这是因为 UT8 编码。

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多