2013-10-28 30 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