模型字段没有在Django管理员中显示正确的编码

时间:2014-09-01 20:37:15

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

我正在使用带有UTF8编码的Postgresql数据库,en_US.UTF-8整理和ctype。

以下是相关模型:

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
تÙسÙر اÙÙرا٠اÙعظÙÙ

我也在管理界面中遇到相同的编码: screenshot of admin interface

同时,psql中的select返回: psql select results

关于发生了什么的任何想法?

1 个答案:

答案 0 :(得分:1)

如评论中所述,我从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<dumpfile> <db>
  4. 重新导入数据

    似乎问题是导入数据,psql没有可以使用的语言环境信息,并假设LATIN1是正在导入的文件的编码。