Python UnicodeEncodeError:&x27;ascii';编解码器可以';t编码字符[…]

Python UnicodeEncodeError:&x27;ascii';编解码器可以';t编码字符[…],python,unicode,Python,Unicode,我已经阅读了官方文件和一个完整的,非常详细的。我还是不明白为什么它会给我这个错误 以下是我的尝试:我打开一个XML文件,其中包含超出ASCII范围(但在允许的XML范围内)的字符。我使用运行良好的cfg=codecs.open(filename,encoding='utf-8,mode='r')来实现这一点。使用repr()查看字符串也会显示一个unicode字符串 现在我继续用parseString(cfg.read().encode('utf-8')读取它。当然,我的XML文件是从以下内容开

我已经阅读了官方文件和一个完整的,非常详细的。我还是不明白为什么它会给我这个错误

以下是我的尝试:我打开一个XML文件,其中包含超出ASCII范围(但在允许的XML范围内)的字符。我使用运行良好的
cfg=codecs.open(filename,encoding='utf-8,mode='r')
来实现这一点。使用
repr()
查看字符串也会显示一个unicode字符串

现在我继续用parseString(cfg.read().encode('utf-8')读取它。当然,我的XML文件是从以下内容开始的:
。虽然我认为它不相关,但我也为python脚本定义了utf-8,但因为我没有直接在其中写入unicode字符,所以这不应适用于这里。下面的行也是如此:
来自_u未来u。导入unicode文本
,这也是正确的局数

接下来,我将生成的对象传递给我自己的类,在其中我将标记读入如下变量:
xmldata.getElementsByTagName(tagName)[0].firstChild.data
,并将其分配给类中的一个变量

现在,这些命令(obj是该类的一个实例)最有效:

这个命令也可以工作:

print obj.__repr__()
我定义了
\uuuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

这两个命令都可以完美打印,并可以输出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__()

从文档中我得到了这个问题,我终于解决了。问题是(我不知道为什么)如果你直接调用
\uuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
本身)

最后的帮助来自于此。当我使用utf-8编码时,我已经到了让它打印到控制台的步骤(但是一个错误的字母)。通过定义以下内容,最终解决了这个问题:

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

现在剩下的唯一一个悬而未决的问题是:为什么打印obj.\uuu str\uuu()
打印obj
与此不同?这对我来说毫无意义。是的,再次强调一下:调用前者或
\uu repr\uu()
确实有效。而且显式编码仍然有效。

print obj
将使用对象的
\uuuuu str\uuuuuu
。默认编码是什么?我的意思是sys.getdefaultencoding()@BrenBarn:str作为return实现@MaksymPolshcha:根据功能,它是ascii。我真的建议大家看一下Pycon 2012实用Unicode的演讲,或者,我该如何停止这种痛苦?帮助文章不再提供了
def __str__(self):
    return self.__repr__().encode(stdout.encoding)