【问题标题】:UnicodeDecodeError when using a Python string handling function使用 Python 字符串处理函数时出现 UnicodeDecodeError
【发布时间】:2012-05-25 10:03:59
【问题描述】:

我正在这样做:

word.rstrip(s)

其中 word 和 s 是包含 unicode 字符的字符串。

我明白了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

有一个错误报告,该错误在某些 Windows Django 系统上发生。不过,我的情况似乎与那个案子无关。

可能是什么问题?


编辑:代码是这样的:

def Strip(word):
    for s in suffixes:
        return word.rstrip(s)

【问题讨论】:

  • 显示更多代码 - 不要只是告诉我们“words 是包含 unicode 字符的字符串”,向我们展示一个示例,我们可以复制并粘贴到 python 中并查看它的中断.另外,这是什么Python版本?在 Py2 和 Py3 之间,字符串和 unicode 的行为非常不同。
  • 如果您使用的是 py2,unicode.rstrip(word, s) 会发生什么。
  • @lvc:首先,我使用的是 Python 2。当我打印 word 和 s 的值时,我看到它们分别包含 'কিনেও' 和 'ি'。这只是一个例子。它们可以包含各种值。在这种特殊情况下,不应剥离任何内容。 unicode.rstrip(word, s) 给出相同的错误。我的代码如编辑所示。
  • 将额外信息编辑到问题中,不要放在人们可能会错过的 cmets 中。另外,bit.ly/unipain
  • 请注意,rstrip 会从其参数中的字符串末尾去除 字符。所以'aaabbbcccecb'.rstrip('ecb') 的结果是'aaa' 而不是'aaabbbccc'

标签: python unicode internationalization


【解决方案1】:

问题在于s 是一个字节串,而word 是一个Unicode 字符串——因此,Python 尝试将s 转换为一个Unicode 字符串,这样rstrip 才有意义。问题是,它假设s 是用 ASCII 编码的,但显然不是(因为它包含 ASCII 范围之外的字符)。

因此,由于您将其初始化为文字,因此很容易通过在其前面放置 u 将其转换为 unicode 字符串:

suffixes = [u'ি']

会工作。当您添加更多后缀时,您需要在所有后缀前面分别添加u

【讨论】:

  • 如果可以的话,这也是迁移到 Py3 的一大好处。 Py3 中的等效代码是 'কিনেও'.rstrip(b'\xe0\xa6\xbf') - 它不是试图做错事然后抱怨它不起作用,而是告诉你 TypeError: rstrip arg must be None or str 这让你更好地了解如何修复它。跨度>
  • 我目前无法迁移到 Py3,因为我大量使用 NLTK,而且仍然仅适用于 Py2。
【解决方案2】:

我猜这是因为 python2 中的隐式转换。 this document 对此进行了解释,但我建议您阅读 whole presentation 关于在 python 2 和 3 中处理 unicode(以及为什么 python3 更好;-))

所以,我认为解决您的问题的方法是在条带化之前强制将字符串解码为 utf8。

类似:

def Strip(word):
    word = word.decode("utf8")
    for s in suffixes:
        return word.rstrip(s.decode("utf8")

第二次尝试:

def Strip(word):
    if type(word) == str:
        word = word.decode("utf8")
    for s in suffixes:
        if type(s) == str:
            s = s.decode("utf8")
        return word.rstrip(s)

【讨论】:

  • 不起作用。给出同样的错误,这次是在第一次 decode() 调用上。有趣的是,如果我用 word = 'কিনেও' 将 word 的值硬连接到代码中,那么一切正常。但是我帖子中的代码不起作用,即使“打印字”给出了“কিনেও”(即它具有该值)。
  • 你能给我们type(word)的结果吗?
  • type(s) 什么时候坏了?
  • @VelvetGhost 使[u'ি'] (即,在字符串文字前面放一个'u')。这将强制它成为一个 unicode 对象,与 word 相同,这意味着 Python 不会尝试做奇怪的事情来使 rstrip 有意义。
  • 啊哈!使用 [u'ি'] 有效!非常感谢lvc!抱歉,这毕竟是一个愚蠢的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2019-06-17
相关资源
最近更新 更多