现在完全糊涂了……我正在使用 python/django 开发并使用 python 日志记录。我所有的应用程序都需要 unicode,而我所有的模型都只有一个unicode ()`,return u'..' 实现了方法。现在在登录时,我遇到了一个非常奇怪的问题,我花了很长时间才发现我可以重现它。我已经尝试过 Py 2.5.5 和 Py 2.6.4 和同样的东西。所以
每当我做一些直接的日志记录时,比如:
logging.debug(u'new value %s' % group)
这称为模型组。unicode ():返回 unicode(group.name)
我的 unicode 方法看起来都是这样的:
def __unicode__(self):
return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)
即使 group.name 是 XXX 或 ÄÄÄ(需要 unicode),这也有效。但是当我出于某种原因想要记录一个集合、列表、字典、django-query 集合以及列表中的各个实例时,例如列表可能是 unicode 或不是我遇到了麻烦......
因此,每当 group.name 需要像 Luleå (我的家乡)这样的 unicode 时,这会给我一个 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, the-stuff-in-the-list),然后在尝试将ascii解码为 unicode 时,这当然行不通——因为列表中的一个元素已恢复当对它进行repr 时,你'...' 本身。
但这是为什么呢????
以及为什么当我记录诸如 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 ;-(