[英]Django: Non-ASCII character
我的Django视图/模板无法处理特殊字符。 由于ñ,下面的简单视图失败了。 我得到以下错误:
文件中的非ASCII字符'\\ xf1'
def test(request):
return HttpResponse('español')
我需要设置一些常规设置吗? 如果我必须分别处理所有字符串会很奇怪:非美国字母很常见!
编辑这是对以下评论的回应。 它仍然失败:(
我按照Gabi的建议将编码注释添加到我的视图中,并将元信息添加到我的html中。
现在我上面的例子没有给出错误,但是ñ显示不正确。
我试过return render_to_response('tube/mysite.html', {"s": 'español'})
。 没有错误,但是没有错误(如果s = hello则会发生)。 html页面上的其他信息显示正常。
我尝试将'español'硬编码到我的HTML中,但失败了:
UnicodeDecodeError'utf8'编解码器无法解码字节0xf。
我在字符串前面尝试了你:
SyntaxError(unicode错误)'utf8'编解码器无法解码字节0xf1
这有帮助吗?
你在脚本的开头是否有这个:
# -*- 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" />
插入views.py的顶部
# -*- coding: utf-8 -*-
并在字符串前添加“u”
my_str = u"plus de détails"
解决了!
您需要Gabi提到的编码注释,并在字符串前使用unicode“u”符号:
return HttpResponse(u'español')
我在网上找到的解释所有ASCII / Unicode混乱的最佳页面是: http : //www.stereoplex.com/blog/python-unicode-and-unicodedecodeerror
请享用!
在settings.py文件中将DEFAULT_CHARSET设置为'utf-8'
。
ref来自: 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字符串。 因此,作为一般规则,如果传入一个bytestring,请准备好在结果中接收一个Unicode字符串。“
关于编码的事情是,除了声明使用UTF-8(通过<meta>
和项目的settings.py
文件)之外,您当然应该尊重您的声明: 确保使用UTF-8编码保存您的文件。
原因很简单:您告诉解释器使用特定的字符集进行IO。 当您没有使用该charset保存文件时,解释器将丢失。
一些IDE和编辑器默认使用Latin1(ISO-8859-1),这解释了为什么Ryan他的答案可行。 虽然它不是原始问题的有效解决方案,但是快速修复。
我正在努力解决与@dkgirl相同的问题,但尽管在此处提出了所有更改,我仍然无法获得我在settings.py中定义的包含ñ的常量字符串,以显示在从我的模板呈现的页面中。
相反,我将我的python代码中的每个“utf-8”实例从上面的解决方案替换为“ ISO-8859-1 ”(Latin-1)。 它现在工作正常。
奇怪,因为一切似乎表明ñ是由utf-8支持的(实际上我仍然在我的模板中使用utf-8)。 也许这只是旧版Django版本的问题? 我正在运行1.2 beta 1。
可能导致问题的其他任何想法? 这是我的旧追溯:
Traceback(最近一次调用最后一次):
文件“manage.py”,第4行,in
导入设置#假设在同一目录中。
文件“C:\\ dev \\ xxxxx \\ settings.py”,第53行
('es',ugettext(u'Espa±ol')),
SyntaxError :( unicode错误)'utf8'编解码器无法解码位置0的字节0xf1:意外的数据结束
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.