繁体   English   中英

Django:非ASCII字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM