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(通过 <meta>
和项目的 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 - 上传非拉丁命名文件时