如何处理查询参数的编码?

3 投票
5 回答
5174 浏览
提问于 2025-04-15 14:51

我原以为我网站上发送的所有数据都是utf-8格式的,因为整个网站都是用这种格式的。结果我错了。

比如说,这个例子中,字符 ä 在文档里是utf-8格式的(来自查询字符串),但当你点击提交时,它却发送了 B\xe4ule(这可能是ISO-8859-1或windows 1252格式)。同时,它还会发送一个ajax请求,这个请求也因为尝试解码非utf-8字符而失败。

在django中,我的request.POST数据真的是一团糟:

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

我该怎么做才能让这些麻烦都消失,确保一切都用utf-8格式呢?

5 个回答

0

根据在PHP中将非UTF-8表单字段转换为UTF-8的内容,你需要确保网页本身是使用UTF-8编码来提供的。

1

你还应该在 <form/> 标签中加上 accept-charset="UTF-8"

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'

我觉得你的问题可能是因为查询参数的编码不正确。

撰写回答