我假设发送到我的参数字符串的任何数据都是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中工作?
答案 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?