【问题标题】:Django \u characters in my UTF8 strings我的 UTF8 字符串中的 Django \u 字符
【发布时间】:2026-01-08 21:20:02
【问题描述】:

我正在将 UTF-8 数据添加到 Django 中的数据库中。

当数据进入数据库时​​,一切看起来都很好 - 字符(例如):“Hello”是 UTF-8 编码的。

我的 MySQL 数据库是 UTF-8 编码的。当我通过选择检查数据库中的数据时,我的示例字符串如下所示:?Hello?。我假设这将字符显示为 UTF-8 编码。

但是,当我从终端中的数据库中选择数据或导出为 Web 服务时 - 我的字符串如下所示:\u201cHello World\u201d。

有人知道如何正确显示我的角色吗?

我需要在某处执行一些额外的 UTF-8 编码吗?

谢谢, 尼克。

【问题讨论】:

    标签: python django utf-8


    【解决方案1】:
    u'\u201cHello World\u201d'
    

    是 Unicode 文本 “Hello World” 的正确 Python 表示。 smartquote 字符使用\uXXXX 十六进制转义而不是逐字显示,因为将Unicode 字符写入终端经常会出现问题,尤其是在Windows 上。 (看起来 MySQL 试图将它们写入终端但失败了,导致 ? 占位符。)

    在能够正确输入和输出 Unicode 字符的终端上,您可以确认它们是相同的:

    Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> u'\u201cHello World\u201d'==u'“Hello World”'
    True
    

    就像字节串一样,\x 序列和字符一样:

    >>> '\x61'=='a'
    True
    

    现在,如果您有 \u\x 序列转义 Python 并进入导出文件,那么您在导出时做错了。也许你在某个地方误用了repr()

    【讨论】:

    • 是的 - 你是正确的。也谢谢你的详细解释!!我需要在导出中添加 'ensure_ascii=False':'HttpResponse(simplejson.dumps(final, ensure_ascii=False));'
    • 啊,这是一个 JSON 响应?在这种情况下,它仍然可以:\u 转义在 JavaScript 字符串文字中与在 Python 中一样有效。 ensure_ascii=False 为您提供稍小的 JSON 输出,但要小心,因为它不会编码 U+2028 和 U+2029 字符,它们在 JavaScript 中充当行分隔符。它们被允许在 JSON 中的字符串文字中不转义,但是如果您从 JavaScript 中 eval() 它们(在没有本机 JSON 对象的旧浏览器上评估 JSON 的常用方法),您将收到语法错误。