2012-07-01 47 views
14

我看了从官方文档的HOWTO on Unicode和一个完整的,非常详细article为好。不过,我不明白为什么它会抛出我这个错误。UnicodeEncodeError:“ASCII”编解码器不能编码字符[...]

以下是我尝试:我打开一个包含字符的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

这两个命令打印完美,可以输出t他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()* –

+0

@BrenBarn:__str__实现为返回__repr __() – javex

回答

4

我终于解决了这个问题。问题在于(我不确定为什么),如果直接调用__str__()__repr__(),它可能会处理得很好,但直接打印(如:print obj)不起作用(尽管它本身只应该调用__str__()本身)。

最终帮助来自这个article。当我使用utf-8编码时,我已经到了将它打印到控制台(但错误的字母)的步骤。终于解决它通过定义这是完全正确的:

def __str__(self): 
    return self.__repr__().encode(stdout.encoding) 

现在唯一悬而未决的问题剩下的就是:为什么print obj.__str__()print obj不同与此?这对我来说没有任何意义。是的,再次强调:调用前者或__repr__() DID工作。仍然用显式编码。

+0

帮助文章不再可用 – Martlark

相关问题