为什么 JSONObject 将某些 unicode 字符视为纯字符串

时间:2021-04-13 21:03:40

标签: json

我有一个程序可以处理客户输入并将其转换为 json 字符串,这样我就可以将该字符串作为 json 类型放入 mysql 中。我使用的库是 JSONObject 放置键/值并将其作为字符串读取。代码示例如下:

        final JSONObject json = new JSONObject();
        StringBuilder sb = new StringBuilder();
        sb.append('\u0081');
        sb.append('\u0072');
        final String value = "Müller";
        json.put(sb.toString(), value);
        System.out.println(json);

结果是

{"\u0081r":"Müller"}

unicode char '\u0081' 被视为原始字符串,但 char '\u0072' 被正确解码为 char。我跟踪 JSONObject 中的代码,发现它具有以不同方式处理各种范围内的 unicode 字符的逻辑,c 是字符串中的字符:

      if (c >= ' ' && (c < 128 || c >= 160) && (c < 8192 || c >= 8448)) {
                    w.write(c);
                } else {
                    String hhhh = "000" + Integer.toHexString(c);
                    w.write("\\u" + hhhh.substring(hhhh.length() - 4));
                }

我的问题是:

  1. 为什么代码的范围比 RFC 中为 Json 定义的受限字符更广:https://www.rfc-editor.org/rfc/rfc4627.html
  2. 是否有更好的库允许更多字符(与 RFC 中的限制相同)?我探索了 Gson,但它对某些超出 RFC 限制的字符也有一些奇怪的限制

0 个答案:

没有答案
相关问题