Django + SQLite中的Unicode字符串

时间:2014-03-11 11:28:02

标签: python django unicode

我在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'

为什么不正确返回字段值?

1 个答案:

答案 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.textprint repr(t.text)的例外有效,则您的终端配置不正确。您可以在这种情况下将值显式编码为UTF-8,因为那已经适合您:

print t.text.encode('utf8')