现在我有些困惑了...我正在使用python/django进行开发,并使用python logging。我的所有应用程序都需要unicode,而我的所有模型只实现了一个unicode(),返回u'...'的方法。现在当我记录日志时,我遇到了一个非常奇怪的问题,它花费了很长时间才发现我可以重现它。我尝试过Py 2.5.5和Py 2.6.4,但结果相同。
每当我进行一些简单的记录,例如:
logging.debug(u'new value %s' % group)
这个调用模型组unicode()方法,返回模型组名称的unicode编码。
我的所有unicode方法都是这样的:
def __unicode__(self):
return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)
即使group.name是XXX或ÄÄÄ(需要Unicode),这也有效。但是,当我因某种原因想要记录集合、列表、字典、Django查询集以及例如列表中的单个实例时,它们可能是Unicode或非Unicode,我就会遇到麻烦...
因此,每当group.name需要Unicode(如我的家乡Luleå)时,这将导致UnicodeDecodingError。
logging.debug(u'new groups %s' % list_of_groups)
通常我会遇到这样的错误:
Exception Type: UnicodeDecodeError
Exception Value: ('ascii', '<RBACInstanceRoleSet: s2 | \xc3\x84\xc3\x96\xc3\x96\xc3\x85\xc3\x85\xc3\x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')
但是如果我使用print list_of_groups
,所有内容都可以在终端上输出良好。
所以,我的理解是列表开始生成并对其所有元素进行repr(),它们返回自己的值 - 在这种情况下应该是's2 | ÅÄÖÖ',然后列表呈现为(ascii,列表中的内容),然后尝试将ascii解码为unicode时,当然不会起作用 - 因为列表中的一个元素在repr时返回了u'...'。
但这是为什么????
为什么每当我记录像group.name或group这样的简单事物,并调用unicode方法时,就可以正确处理unicode和ascii。每当我变懒惰并想记录一个列表、集合或其他事情时,遇到unicode字符时就会出问题...
一些更多工作和失败的例子。如果是group.name
,我会转到模型字段,而group
则调用__unicode__()
。
logging.debug("1. group: %s " % group.name) # WORKS
logging.debug(u"2. group: %s " % group) # WORKS
logging.debug("3. group: %s " % group) # FAILS
logging.debug(u"4. group: %s " % group.name) # WORKS
logging.debug("5. group: %s " % group.name) # WORKS
我真的以为我已经掌握了Unicode,但是现在感觉有点力不从心。