我在Django 1.6中有一个模型:
class Text(models.Model):
text = models.CharField()
def __unicode__(self):
return self.text
我在此字段的表格中存有西里尔文字。
当我尝试从Django shell中的表中请求对象时,我得到了令人困惑的结果:
print t
返回表
中存储的正确字符串print t.text
返回u'u\0427u\0438'
为什么不正确返回字段值?
答案 0 :(得分:2)
当您使用print
时,Python将尝试使用sys.stdout.encoding
将Unicode值编码到终端或控制台编解码器;如果将此设置为无法对数据进行编码的编码,则会引发UnicodeEncodingException
。
另一方面,您尝试使用repr()
,或者只是让t.text
在交互式会话中回显,这可归结为相同的事情。 repr()
将为您提供字符串文字的ASCII安全表示,该值可以直接粘贴到解释器中以重新创建字符串。为了保持ASCII安全,所有不可打印ASCII字符的代码点都使用转义序列来表示;新行再次成为\n
,而传递Latin-1范围的代码点使用\uxxxx
表示。
另一方面,当您使用print model
时,会使用默认的.__str__()
method on models;此方法将.__unicode__()
方法返回的Unicode值编码为UTF-8。
如果您在使用print t
时看到正确的输出,print t.text
和print repr(t.text)
的例外有效,则您的终端配置不正确。您可以在这种情况下将值显式编码为UTF-8,因为那已经适合您:
print t.text.encode('utf8')