我无法完成Ajax提交的往返,其中涉及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。
有人理解这一点,可以在此过程中指出“这是你的简单错误吗?”
谢谢, 杰罗姆。
更新:如果我将其添加到我的服务器:
response.setContentType("application/json; charset=UTF-8");
我在浏览器中输入了服务器发送的六个UTF-8字符。我的问题转化为让字符在文本字段中正确显示。它们显示为Ç®aÆb,这是我想要显示的“扩展ASCII”。我想我可以通过解码器运行文本,但是我错过了另一种配置吗?
答案 0 :(得分:0)
对于其他人的参考,我最近解决了这个问题。大多数情况下,我需要将contentType显式设置为UTF-8。文档说,如果没有,则假设为UTF-8。这只适用于Firefox浏览器。
一旦您明确设置了UTF-8传输,并且字符最终会在您的服务器中以 UTF-16 结束。