2009-10-06 36 views
3

我認爲發送給我的參數字符串的任何數據都是utf-8,因爲這是我整個站點使用的。瞧,我錯了。如何處理查詢參數的編碼?

對於this example有字符ä文檔(從查詢字符串)以UTF-8,但繼續發送下一個B\xe4ule(這是可以ISO-8859-1或Windows 1252)當您點擊提交。它也引發了一個ajax request,它也試圖解碼non-utf8字符失敗。

一個在Django,我request.POST真的搞砸了:

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

如何我只是做所有這些頭痛消失,工作UTF8?

+0

不確定它是否相關,但文檔提到了表單提交中的編碼方面的一些問題:http://docs.djangoproject.com/en/dev/ref/unicode/#form-submission – codeape 2009-10-06 18:39:49

回答

0

儘管AFAIK沒有在任何地方指定,但所有瀏覽器都使用HTML頁面的字符編碼,表格作爲編碼將表單提交回服務器。因此,如果您希望URL參數採用UTF-8編碼,則必須確保表單所嵌入的HTML頁面也採用UTF-8編碼。

+0

好吧,我給出的頁面作爲一個例子是UTF-8的權利? – 2009-10-06 17:42:54

+0

完全取決於您在頁面中聲明的標題。而且,可能還有服務器在您背後發送的HTTP標頭(這可能會非常棘手)。 – 2009-10-06 17:45:04

+0

那麼,檢查我的網頁:'和header:'Content-Type \t text/html; charset = utf-8' – 2009-10-06 17:48:37

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

您還應該將accept-charset="UTF-8"添加到<form/>標記。

0

獲取從提交的形式的UTF-8字符串應該只是編碼 unicode的對象的問題:

下一= request.POST [ '下一個']編碼( 'UTF-8')

對於AJAX請求,您是否可以確認該請求也是作爲utf-8發送的,並且在頭文件中聲明爲utf-8?