【问题标题】:JSON and escaping charactersJSON 和转义字符
【发布时间】:2011-06-21 12:43:06
【问题描述】:

我有一个字符串,它在 Javascript 中序列化为 JSON,然后反序列化为 Java。

看起来如果字符串包含度数符号,那么我会遇到问题。

我可以借助一些帮助来找出该怪谁:

  • 是 Spidermonkey 1.8 的实现吗? (这有一个内置的 JSON 实现)
  • Google gson吗?
  • 是我做的不好?

以下是 JSDB 中发生的情况:

js>s='15\u00f8C'
15°C
js>JSON.stringify(s)
"15°C"

我原以为 "15\u00f8C' 这让我相信 Spidermonkey 的 JSON 实现没有做正确的事情......除了 JSON homepage's syntax description(这是规范吗?)说 char 可以是

任何-Unicode 字符- 除了-"-或-\-或- 控制字符”

所以也许它按原样传递字符串而不将其编码为 \u00f8... 在这种情况下,我认为问题出在 gson 库上。

谁能帮忙?

我想我的解决方法是使用不同的 JSON 库,或者在调用 JSON.stringify() 后自己手动转义字符串——但如果这是一个错误,那么我想提交一个错误报告。

【问题讨论】:

  • grrr... 别介意我的 Windows PC 决定使用将度数符号映射到 \u00f8 而不是 \u00b0 的字符集!

标签: json unicode


【解决方案1】:

这太晚了,可能不再相关,但如果有人偶然发现这个答案,我相信我知道原因。

因此,正如另一个答案所提到的,JSON 编码的字符串与其中的度数符号完全有效。问题很可能出在您正在读/写的字符编码中。根据您使用 Gson 的方式,您可能传递给它一个 java.io.Reader 实例。每当您从InputStream 创建Reader 时,您需要 指定字符编码或java.nio.charset.Charset 实例(通常最好使用java.nio.charset.StandardCharsets.UTF_8)。如果您不指定Charset,Java 将使用您的平台默认编码,在Windows 上通常为CP-1252

【讨论】:

    【解决方案2】:

    这不是两种实现中的错误。不需要转义 U+00B0。引用RFC

    2.5。字符串

    字符串的表示是 类似于 C 中使用的约定 编程语言家族。一种 字符串以引号开头和结尾 分数。所有 Unicode 字符都可能是 放在引号内 除了必须的字符 转义:引号,反向 固相线和控制字符 (U+0000 到 U+001F)。

    任何字符都可以被转义。

    对所有内容进行转义会增加数据的大小(在所有 Unicode 转换格式中,所有代码点都可以用 4 个或更少的字节表示;而对它们全部进行编码则使它们成为 6 个或 12 个字节)。

    您的代码中的某处很可能存在文本转码错误,并且转义 ASCII 子集中的所有内容会掩盖问题。 JSON 规范要求所有数据都使用 Unicode 编码。

    【讨论】:

    • @user:支持不在英文基本字母表中的字符并没有什么懒惰的。欢迎来到 2015 年,我们不再使用 ASCII。
    【解决方案3】:

    嗯,无论如何,这里有一个解决方法:

    function JSON_stringify(s, emit_unicode)
    {
       var json = JSON.stringify(s);
       return emit_unicode ? json : json.replace(/[\u007f-\uffff]/g,
          function(c) { 
            return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
          }
       );
    }
    

    测试用例:

    js>s='15\u00f8C 3\u0111';
    15°C 3◄
    js>JSON_stringify(s, true)
    "15°C 3◄"
    js>JSON_stringify(s, false)
    "15\u00f8C 3\u0111"
    

    【讨论】:

    • 在这里 ping 一个旧答案,但对于 BMP 之外的字符,这似乎会失败。
    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 2014-01-31
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多