2011-04-05 53 views
0

我使用dojo和struts 1.3.8,我想通過dojo.xhrGet將一些「特殊」字符(如è,°,ù,€)傳遞給動作struts saveBill。但是,當我打印JSON的動作它給了我DOJO xhr使用特殊字符獲取json

è la prova n°10 

我不知道問題出在哪裏,我將所有內容類型爲UTF-8在所有的JSP ...我也用過struts過濾器編碼在UTF-8 ...沒有...我錯了哪裏? 這是JavaScript代碼

var billJson = {"row":"0","descr":"è la prova n°10"}; 
dojo.xhrGet({ 
    url: "saveBill.do", 
    headers: {'bill': billJson, 'Content-Type': 'application/json; charset=UTF-8'}, 
    handleAs: "text", 
    load: function(response, ioArgs) { 
      showMessage(response); 
    }, 
    error: function(message, ioArgs) { 
      showMessage(message); 
    } 
}); 

,這是響應標頭(來自螢火蟲複製&糊)

Host localhost:9080 
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8 
Accept-Language it-it,it;q=0.8,en-us;q=0.5,en;q=0.3 
Accept-Encoding gzip, deflate 
Accept-Charset UTF-8,* 
Keep-Alive 115 
Connection keep-alive 
bill {"row":"0","descr":"è la prova n°10"} 
Content-Type application/json; charset=UTF-8 
X-Requested-With XMLHttpRequest 
Referer http://localhost:9080/CA3_S_001/login.do 
Cookie invoiceTreeSaveStateCookie=undefined%2C000001%2C000014; JSESSIONID=0000QeyArD4K7CDr_oyNkrpw9Zk:-1 

謝謝!

+0

您正在將數據傳遞到名爲「bill」的標題字段中?你爲什麼在傳遞JSON時使用handleAs = text? 「文本」不會做任何轉義,所以你必須編碼你的非ASCII字符。 – 2011-04-06 05:19:33

+0

你的服務器在內容上聲明utf-8,但是你確定服務器上的內容實際上是在utf-8中編碼(匹配)的嗎? – peller 2011-04-08 02:35:28

回答

0

HTTP標頭中發送JSON是相當不規範,和我不會推薦它。不在標頭中發送JSON的一個原因是,正如您發現的那樣,HTTP標頭只是字節;他們沒有內在的代碼頁來將它們轉換成字符串。相反,我會發送POST主體中的JSON數據;我想你會有更好的運氣。

但是,如果您絕對必須在頭中發送非ASCII JSON數據,則可以嘗試調用ServletRequest.setCharacterEncoding(「UTF-8」)。我認爲它隻影響URL參數和POST正文的解析,但值得一試。正如Robot Woods所建議的那樣,您也可以在JSON中對所有非A​​SCII字符進行編碼(其中XXXX是字符的UTF-16編碼的十六進制表示形式)。

但嚴重的是,只是把它放在POST機構;這是一個更強大,更好的解決方案。