【问题标题】:Model field isn't showing up with proper encoding in Django admin模型字段在 Django admin 中没有以正确的编码显示
【发布时间】:2014-09-01 20:37:14
【问题描述】:

我正在使用带有UTF8 编码、en_US.UTF-8 collat​​e 和 ctype 的 Postgresql 数据库。

以下是相关模型:

class Book(models.Model):
    book_id = models.IntegerField(primary_key=True, db_column='Book_ID')
    lib_id = models.IntegerField(db_column='LIB_ID')
    call_no = models.IntegerField(db_column='Call_no')
    title = models.CharField(max_length=100, db_column='Title')
    alt_title = models.CharField(max_length=100, db_column='Alt_Title')

    def __unicode__(self):
        return self.alt_title

在 django shell 中,我在打印对象时得到了一些奇怪的编码,但在打印 alt_title 时却没有。

>>> from library.models import Book
>>> book = Book.objects.filter(book_id=2)[0]
>>> book
<Book: ØªÙØ³Ùر اÙÙØ±Ø§Ù Ø§ÙØ¹Ø¸ÙÙ>
>>> book.alt_title
u'\xd8\xaa\xd9\x81\xd8\xb3\xd9\x8a\xd8\xb1 \xd8\xa7\xd9\x84\xd9\x82\xd8\xb1\xd8\xa7\xd9\x86 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb8\xd9\x8a\xd9\x85'
>>> print book
ØªÙØ³Ùر اÙÙØ±Ø§Ù Ø§ÙØ¹Ø¸ÙÙ

我在管理界面中也得到了相同的编码:

同时,psql 中的 select 返回以下内容:

对正在发生的事情有什么想法吗?

【问题讨论】:

  • 我认为提及这一点并不重要,但我确实将数据从 MySQL 导入 Postgres。
  • 我有我的 sql 转储文件并使用不同的编码,似乎 Django 显示的是某种西方编码。它可能是 Windows 1252、ISO 8859-1、ISO 8859-3、ISO 8859-15。
  • 你的终端中locale 命令的输出是什么?此外,在您的 Django 应用程序中,您是否为请求发送编码标头?
  • @CraigRinger,好问题:) ...我能够在一些帮助下解决它(请参阅我的答案)。

标签: django postgresql encoding utf-8 django-models


【解决方案1】:

如 cmets 中所述,我将数据从 MySQL 导入 PostgreSQL。

我确保 MySQL 转储文件以 UTF-8 编码。

但是,在 psql 中运行 \encoding 命令,返回 'LATIN1' 作为编码。

奇怪的是,select 返回了正确编码的结果。

我已经从 OS X 上的终端应用程序通过 SSH 连接到我的服务器。在远程服务器中运行 locale 返回没有编码设置的“en_US”。事实证明,由于我在使用 SSH,select 结果正在被我的终端应用程序清理。

所以,要解决这个问题:

  1. 我从表中删除了导入的数据。
  2. 将语言环境配置为 en_CA.UTF-8。详情请见this documentation
  3. 使用psql -f&lt;dumpfile&gt; &lt;db&gt;重新导入数据

问题似乎是在导入数据时,psql 没有可使用的区域设置信息,并假定 LATIN1 是要导入的文件的编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2011-03-07
    • 2018-01-10
    • 2020-02-14
    • 2017-05-08
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多