【问题标题】:Django UnicodeDecodeError after migrating to python 3.6迁移到 python 3.6 后的 Django UnicodeDecodeError
【发布时间】:2021-05-18 17:06:53
【问题描述】:

我正在将项目从 django 1.11 迁移到 django 2 并遇到以下问题。在 django 1.11 上从 python 2.7 迁移到 python 3.6 后,有很多 UnicodeDecodeError's 当我试图通过 ORM 获取一些数据时。例如:

class JournalName(models.Model):

    id = models.AutoField(primary_key=True)
    par_id = models.ForeignKey('Journal', db_column='par_id')
    parent = models.CharField(max_length=255)
    name = models.TextField(blank=True, db_column=u'name')
    lang = models.CharField(max_length=10, blank=True)

    class Meta:
        db_table = 'journal_name'

    def __str__(self):
        return self.name

以下打印:

print(JournalName.objects.all())

有错误的结果:

UnicodeEncodeError: 'ascii' codec can't encode character '\u0142' in position 768: ordinal not in range(128)

项目正在使用带有 utf8 的 MySQL 数据库。我试图调试这个,但我不知道是什么导致了这个问题。在 python 2.7 上一切正常,所以与 py2 相比,代码中可能还有一些我应该改变的东西? 我不得不删除数据库设置中的一些导致其他错误的选项,但也许它与此有关:

'OPTIONS': {
   "init_command": "set names latin1;",
}

【问题讨论】:

  • 好的,但我无法对 Django QuerySet 进行编码。我认为它与设置或其他东西有关
  • 在您的模型定义中,'____str____' 函数是什么样的?
  • 你找到解决办法了吗?

标签: python-3.x django python-2.7 unicode


【解决方案1】:

也许,您使用的是 ASCII 语言环境(例如“C”或“POSIX”)。

您可以通过以下方式打印非 ASCII 字符串:

  • 使用 UTF-8 语言环境(例如“en_US.UTF-8”、“C.UTF-8”等...)
  • 设置“PYTHONIOENCODING=utf-8”环境变量。但请注意,这只会更改 stdio 编码。

但我强烈建议升级 Python 3.7+。从 Python 3.7 开始:

  • 当您使用“C”或“POSIX”语言环境时,Python 会自动尝试将语言环境更改为 C.UTF-8(请参阅 PEP 538)。
  • 如果没有“C.UTF-8”语言环境,Python 会自动启用 UTF-8 模式(请参阅 PEP 540)。

因此您可以更轻松地使用 UTF-8。

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 2023-03-07
    • 1970-01-01
    • 2013-01-15
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多