UnicodeEncodeError: 'ascii' 编解码器无法编码字符 [...]

15

我已经阅读了官方文档中有关Unicode的 HOWTO,还有一篇非常详细的文章。但是,我仍然不明白为什么会出现错误。

以下是我的尝试:我打开一个包含ASCII范围之外字符(但在允许的XML范围内)的XML文件。我使用cfg = codecs.open(filename, encoding='utf-8', mode='r')做到这一点,这个命令运行得很好。使用repr()查看字符串也向我展示了Unicode字符串。

现在我继续使用parseString(cfg.read().encode('utf-8')) 去读取它。当然,我的XML文件以这个开始: <?xml version="1.0" encoding="utf-8"?>。虽然我认为这不相关,但我也为我的Python脚本定义了utf-8,但是由于我没有直接在其中编写Unicode字符,所以这里不适用。同样,以下行:from __future__ import unicode_literals 也正确地位于开头。

接下来,我将生成的对象传递给我的自定义类,我将标记读取到变量中,例如:xmldata.getElementsByTagName(tagName)[0].firstChild.data,并将其分配给我的类中的变量。

现在,以下命令完美地工作(obj是该类的实例):

for element in obj:
    print element

这个命令也是有效的:

print obj.__repr__()

我定义了__iter__()方法来简单地逐个返回每个变量,而__repr__()方法使用了典型的printf格式:"%s" % self.varname

这两个命令都可以完美打印并输出Unicode字符。 但是以下内容无法正常工作:

print obj

现在我遇到了困难,因为这会抛出可怕的

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47:

那么我错在哪里?我做错了什么?我正在寻找一种通用解决方案,我总是希望将字符串处理为Unicode,以避免任何可能的错误并编写兼容的程序。

编辑:我还定义了这个:

def __str__(self):
    return self.__repr__()
def __unicode__(self):
    return self.__repr__()

根据文档,我了解到这个


1
使用print obj会调用对象的__str__而不是__repr__ - BrenBarn
2
你的默认编码是什么?我的意思是 *sys.getdefaultencoding()*。 - Maksym Polshcha
@MaksymPolshcha:根据该函数,它是ASCII码。 - javex
1
我非常推荐观看Pycon 2012的这个演讲:实用Unicode,或者说,如何停止痛苦?http://www.youtube.com/watch?v=sgHbC6udIqc - root
我的默认编码是ASCII。我以为Python默认使用UTF-8编码呢?! - jmoz
显示剩余2条评论
1个回答

5
我终于解决了问题。问题是(我不确定为什么),如果直接调用__str__()__repr__(),它会很好地处理它,但是直接打印它(如:print obj)不起作用(尽管它应该只是调用__str__()本身)。
最终的帮助来自于这个article。当我使用utf-8编码时,我已经到了将其打印到控制台的步骤(但是字母错误)。最终通过定义以下内容完美地解决了这个问题:
def __str__(self):
    return self.__repr__().encode(stdout.encoding)

现在唯一未解决的问题是:为什么使用此代码,print obj.__str__()print obj输出结果不同?对我来说毫无意义。是的,再次强调:调用前者或__repr__()可以正常工作。并且在显式编码的情况下仍然有效。

帮助文章已不再可用。 - Martlark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接