我从官方文档中读到了关于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也是如此:它也在开头.
接下来我将生成的Object传递给我自己的类,在那里我将标签读入这样的变量:xmldata.getElementsByTagName(tagName)[0].firstChild.data并将其分配给我的类中的变量.
现在最完美的是那些命令(obj是类的一个实例):
for element in obj:
print element
Run Code Online (Sandbox Code Playgroud)
这个命令也可以工作:
print obj.__repr__()
Run Code Online (Sandbox Code Playgroud)
我定义__iter__()了在__repr__()使用典型的printf 时只产生每个变量:"%s" % self.varname
两个命令都打印完美,可以输出unicode字符.什么不起作用是这样的:
print obj
Run Code Online (Sandbox Code Playgroud)
现在我被卡住了,因为这会引起可怕的
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47:
Run Code Online (Sandbox Code Playgroud)
那我错过了什么?我究竟做错了什么?我正在寻找一个通用的解决方案,我总是希望将字符串作为unicode处理,只是为了避免任何可能的错误并编写兼容的程序.
编辑:我也定义了这个:
def __str__(self):
return self.__repr__()
def __unicode__(self):
return self.__repr__()
Run Code Online (Sandbox Code Playgroud)
从文档我得到了这个
我终于解决了。问题是(我不确定为什么),如果您调用了一个__str__()或__repr__()直接调用它,将无法正常处理,但是直接打印(如:中的代码print obj)是行不通的(尽管它只能__str__()自行调用)。
最终的帮助来自本文。当我使用utf-8编码时,我已经到达将其打印到控制台的步骤(但是字母错误)。最后,通过定义以下内容将其完全正确地解决:
def __str__(self):
return self.__repr__().encode(stdout.encoding)
Run Code Online (Sandbox Code Playgroud)
现在唯一悬而未决的问题剩下的就是:为什么print obj.__str__()和print obj不同与此?这对我来说毫无意义。是的,再次强调一下:调用前者或__repr__()DID起作用。并且仍然使用显式编码。