【问题标题】:Ajax, JSON and Unicode *almost* working right for me -- where did I go wrong?Ajax、JSON 和 Unicode *几乎*适合我——我哪里出错了?
【发布时间】:2013-10-28 20:13:14
【问题描述】:

我无法完成涉及 Unicode 字符的 Ajax 提交的往返行程。有些工作,有些不工作。例如,假设要发送以下文本:

Ǯ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 字段就变成了

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”。我想我可以通过解码器运行文本,但是我错过了另一个配置吗?

【问题讨论】:

    标签: ajax json unicode utf-8


    【解决方案1】:

    供其他人参考,我最近解决了这个问题。大多数情况下,我需要将 contentType 显式设置为 UTF-8。文档说,如果不存在,则假定为 UTF-8。目前这仅适用于 Firefox 浏览器。

    一旦您明确设置,UTF-8 传输就完成了,字符最终会在您的服务器中作为 UTF-16

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 2016-08-02
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2011-03-14
      • 2013-12-25
      • 2018-01-21
      相关资源
      最近更新 更多