如何处理查询参数编码?

时间:2009-10-06 17:27:51

标签: python django unicode utf-8

我假设发送到我的参数字符串的任何数据都是utf-8,因为这是我整个网站使用的全部内容。瞧不起我错了。

对于this example文档中的utf-8中的字符ä(来自查询字符串),但继续发送B\xe4ule(ISO-8859-1或Windows 1252)当你点击提交。它还会触发ajax request,但尝试解码非utf8字符也会失败。

在django,我的请求.POST真的搞砸了:

>>> print request.POST
<QueryDict: {u'alias': [u'eu.wowarmory.com/character-sheet.xml?r=Der Rat von Dalaran&cn=B\ufffde']}>

我怎样才能让所有这些令人头疼的事情消失并在utf8中工作?

5 个答案:

答案 0 :(得分:3)

由于Django 1.0从表单提交中获得的所有值都是unicode对象,而不是像Django 0.96及更早版本中的字节串。要从您的值获取utf-8,请使用utf-8编解码器编码:

request.POST['somefield'].encode('utf-8')

要正确解码查询参数,必须先对它们进行正确编码:

In [3]: urllib.quote('ä')
Out[3]: '%C3%A4'

我认为您的问题来自查询参数的错误编码。

答案 1 :(得分:1)

您还应该将accept-charset="UTF-8"添加到<form/>代码。

答案 2 :(得分:0)

虽然AFAIK没有在任何地方指定,但所有浏览器都使用HTML页面的字符编码,表单嵌入在该页面上,作为将表单提交回服务器的编码。因此,如果您希望URL参数为UTF-8编码,则必须确保嵌入表单的HTML页面也是UTF-8编码的。

答案 3 :(得分:0)

根据Get non-UTF-8-form fields as UTF-8 in PHP?,您需要确保使用UTF8编码提供页面本身。

答案 4 :(得分:0)

从提交的表单中获取utf-8字符串应该只是编码的问题 unicode对象:

next = request.POST ['next'] .coding('utf-8')

对于AJAX请求,您能否确认该请求也是以utf-8形式发送的,并在标题中声明为utf-8?