2013-10-28 57 views
0

我在完成涉及Unicode字符的Ajax提交往返時遇到了麻煩。有些工作,有些則不。例如,讓我們說,下面的文本將被髮送:Ajax,JSON和Unicode *幾乎*適用於我 - 我哪裏出錯了?

ǮaƉb

該文本是U + 01EE U + 0061 U + 0189 U + 0062。

我的Ajax調用很簡單:

ServerRequest.ajaxRequest = $.ajax({ 
    type : 'POST', 
    url : ServerRequest.serverUrl, 
    data : sendJSON, 
    dataType : 'json', 

    timeout: 200000, 
    async : async, 
    cache : false, 
    error: function([snip] 

其中sendJSON第一次運行時通過JSON.stringify()。

在調用服務器之前進行測試(Chrome瀏覽器)時,當我在調試器中詢問那個註釋字段時,我在瀏覽器中看到它們是格式化的。它們不以任何其他格式顯示,例如ISO8859-1或UTF-8。

服務器將JSON字符串中的文本看作UTF-8。當重建爲Java對象時,它保持其UTF-8值。

我現在轉過身來發回相同的數據回瀏覽器。在服務器上我轉儲包含數據的字段:

 for(int ix = 0; ix < notes.length(); ix++) { 
      log.info("codepoint notes[" + ix + "]: " + ((int) (notes.codePointAt(ix))) + "\n"); 
     } 

我得到這樣的數據:

codepoint op_notes[0]: 199 (which is 0xC7) 
codepoint op_notes[1]: 174 (which is 0xAE) 
codepoint op_notes[2]: 97  (which is 0x61) 
codepoint op_notes[3]: 198 (which is 0xC6) 
codepoint op_notes[4]: 137 (which is 0x89) 
codepoint op_notes[5]: 98  (which is 0x62) 

這是一個什麼樣發送到服務器的UTF-8表示。

此數據打包到JSON對象中並通過HttpResponse.getWriter()。write()發送到服務器。我們的JSON庫來自json.org。

一旦服務器收到此提示欄上已經成爲

note.charCodeAt(0) = 494  (0x01EE) 
note.charCodeAt(1) = 97  (0x61) 
note.charCodeAt(2) = 65533 (0xFFFD, the "I don't know" value) 
note.charCodeAt(3) = 137  (0x89) 
note.charCodeAt(4) = 98  (0x62) 

的第一個字符回來一個Unicode,吃兩個字節。 'a'吃第三個字節。但其他雙字節字符無法正確傳達。相反,第一個字節被錯誤解釋或丟失,替換爲默認的U + FFFD。

我不明白爲什麼第一個高位字符被接受好,但不是另一個。無論是單獨發送還是與朋友一起發送,這個斜線-D都不被接受。

有人明白這一點,並可以在這個過程中指出「這是你的簡單錯誤」嗎?

謝謝, 傑羅姆。

UPDATE:如果我添加這到我的服務器:

response.setContentType("application/json; charset=UTF-8"); 

我在瀏覽器中得到了相同的六個UTF-8字符的服務器發送它。我的問題轉化爲讓字符在文本字段中正確顯示。它們顯示爲Ç®aÆb,這是我想要顯示的「擴展ASCII」。我想我可以通過解碼器運行文本,但我錯過了另一個配置嗎?

回答

0

對於別人的參考,我最近解決了這個問題。大多數情況下,我需要明確地將contentType設置爲UTF-8。該文檔說,如果沒有這個UTF-8的話。這隻適用於Firefox瀏覽器。

一旦您明確設置了UTF-8傳輸完成並且字符最終在服務器上以UTF-16