Django:非ASCII字符

Posted

技术标签:

【中文标题】Django:非ASCII字符【英文标题】:Django: Non-ASCII character 【发布时间】:2011-06-05 19:57:47 【问题描述】:

我的 Django 视图/模板无法处理特殊字符。由于ñ,下面的简单视图失败了。我收到以下错误:

文件中的非ASCII字符'\xf1'

def test(request):
    return HttpResponse('español')

我需要设置一些常规设置吗?如果我必须单独处理所有字符串会很奇怪:非美国字母很常见!

编辑 这是对以下 cmets 的回应。它仍然失败:(

按照 Gabi 的建议,我将编码注释添加到我的视图中,并将元信息添加到我的 html 中。

现在我上面的例子没有给出错误,但是 ñ 显示不正确。

我试过return render_to_response('tube/mysite.html', "s": 'español')。没有错误,但它不会显示(如果 s = hello 会显示)。 html页面其他信息显示正常。

我尝试将“español”硬编码到我的 HTML 中,但失败了:

UnicodeDecodeError 'utf8' 编解码器无法解码字节 0xf。

我尝试在字符串前面加上 u:

SyntaxError (unicode error) 'utf8' codec can't decode byte 0xf1

这有帮助吗??

【问题讨论】:

您得到的实际错误是什么?是 UnicodeDecodeError 吗? 您使用的是哪个版本的 Django?不是0.96吧? 您需要确保您的编辑器使用您指定的编码保存文件。 【参考方案1】:

你的脚本开头有这个吗:

# -*- coding: utf-8 -*-

...?

看到这个:http://www.python.org/dev/peps/pep-0263/

编辑:对于第二个问题,它是关于 html 编码的。把它放在你的 html 页面的头部(你应该将请求作为一个 html 页面发送,否则我认为你将无法正确输出该字符):

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

【讨论】:

我根据您的 cmets 更新了问题描述。还是不行…… return HttpResponse('string') 很粗糙......使用可以包含上述元数据的 HTML 模板会很有用,然后使用 render_to_response('mytemplate.html')跨度> 这解决了在代码中显式字符串使用特殊字符的问题。谢谢。【参考方案2】:

在views.py的顶部插入

# -*- coding: utf-8 -*-

在你的字符串前加上“u”

my_str = u"plus de détails"

解决了!

【讨论】:

您的答案是this 和this 答案的组合,但不太完整。编辑其他答案以完成它们是首选。如果没有,请至少和其他人一样完整。【参考方案3】:

您需要 Gabi 提到的编码注释,并在您的字符串前使用 unicode“u”符号:

return HttpResponse(u'español')

我在网上找到的解释所有 ASCII/Unicode 混乱的最佳页面是这个: http://www.stereoplex.com/blog/python-unicode-and-unicodedecodeerror

享受吧!

【讨论】:

还是不行。添加注释(但不是 u)会产生另一种错误。现在可以显示该单词,但 ñ 被替换为正方形或其他奇怪的符号,具体取决于浏览器。当我还包括 u 时,它根本不起作用。我得到“utf8”编解码器无法解码位置 0 的字节 0xf1”【参考方案4】:

在您的 settings.py 文件中将 DEFAULT_CHARSET 设置为 'utf-8'

【讨论】:

DEFAULT_CHARSET 默认设置为 utf-8 这可能在发布和评论之间的两年内发生了变化。我也冒昧地等了两年才这么说。【参考方案5】:

我一直在努力解决与@dkgirl 相同的问题,但是尽管进行了此处建议的所有更改,但我仍然无法获得我在 settings.py 中定义的包含 ñ 的常量字符串,以显示在从我呈现的页面中模板。

相反,我将 python 代码中的每个“utf-8”实例从上述解决方案替换为“ISO-8859-1”(Latin-1)。它现在工作正常。

奇怪,因为一切似乎都表明 ñ 受 utf-8 支持(实际上我仍在模板中使用 utf-8)。也许这只是旧 Django 版本的问题?我正在运行 1.2 beta 1。

任何其他可能导致问题的想法?这是我的旧回溯: 回溯(最近一次通话最后一次): 文件“manage.py”,第 4 行,在 import settings # 假设在同一个目录下。 文件“C:\dev\xxxxx\settings.py”,第 53 行 ('es', ugettext(u'Espa±ol') ), SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xf1 in position 0: 数据意外结束

【讨论】:

经过研究,我需要的唯一两个更改都进入了 settings.py:gabi 的“编码”标头(已经有元标记)和 @dominique-guardiola 的强制 unicode 解释。 +1 并感谢您的帮助!【参考方案6】:

参考来自:https://docs.djangoproject.com/en/1.8/ref/unicode/

“如果你的代码只使用 ASCII 数据,那么使用普通字符串是安全的,可以随意传递它们,因为 ASCII 是 UTF-8 的子集。

不要误以为如果您的 DEFAULT_CHARSET 设置设置为 'utf-8' 以外的其他值,您可以在字节串中使用其他编码! DEFAULT_CHARSET 仅适用于作为模板呈现(和电子邮件)结果生成的字符串。 Django 将始终假定内部字节串采用 UTF-8 编码。原因是 DEFAULT_CHARSET 设置实际上不在您的控制之下(如果您是应用程序开发人员)。它由安装和使用您的应用程序的人控制——如果该人选择不同的设置,您的代码仍必须继续工作。因此,它不能依赖该设置。

在大多数情况下,当 Django 处理字符串时,它会在执行任何其他操作之前将它们转换为 Unicode 字符串。因此,作为一般规则,如果您传入一个字节字符串,请准备好在结果中接收一个 Unicode 字符串。”

【讨论】:

【参考方案7】:

关于编码的一点是,除了声明使用 UTF-8(通过 &lt;meta&gt; 和项目的 settings.py 文件)之外,您当然应该尊重您的声明:确保您的文件使用 UTF-8 保存8 种编码。

原因很简单:您告诉解释器使用特定字符集进行 IO。如果您没有使用该字符集保存文件,解释器将会丢失。

一些 IDE 和编辑器将默认使用 Latin1 (ISO-8859-1),这解释了为什么 Ryan 他的答案可以工作。虽然这不是对原始问题的有效解决方案,但可以快速解决。

【讨论】:

以上是关于Django:非ASCII字符的主要内容,如果未能解决你的问题,请参考以下文章

Django REST Framework Serializer和JSONRenderer编码

姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误

Django,nginx,gunicorn,supervisor:UnicodeEncodeError - 上传非拉丁命名文件时

在 Django 中创建 UTF-8 JsonResponse

Django:查找非空字符串的优雅方式

Django 解决返回JSON,汉字转换为Ascii