我已经阅读了官方文档中有关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__()
根据文档,我了解到这个
print obj
会调用对象的__str__
而不是__repr__
。 - BrenBarn