3

我正在这样做:

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)

4

2 回答 2

4

问题是这s是一个字节串,word而是一个 unicode 字符串 - 所以,Python 试图s变成一个 unicode 字符串,这样rstrip才有意义。问题是,它假设s是用 ASCII 编码的,但显然不是(因为它包含 ASCII 范围之外的字符)。

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

suffixes = [u'ি']

将工作。当您添加更多后缀时,您需要u单独在所有后缀前面添加。

于 2012-05-25T12:33:02.963 回答
3

我猜这是因为 python2 中的隐式转换。本文档对此进行了解释,但我建议您阅读有关在 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)
于 2012-05-25T12:01:00.497 回答