【问题标题】:GSON / JSON : Weird special char (umlaut) issueGSON / JSON:奇怪的特殊字符(变音符号)问题
【发布时间】:2011-10-24 10:21:52
【问题描述】:

在尝试使用 GSON 处理 JSON 响应时(输出来自 flickr API,以防您询问)我遇到了我所说的某些特殊字符的非常奇怪的编码:

这是它的十六进制视图:

后跟“双点”的“u”应该是德语“ü”,这就是我的困惑开始的地方。就好像有人把 char 撕成两半,对两部分中的每一部分进行编码。下图显示了我期望的十六进制编码,以防“ü”被正确编码:

更奇怪的是,如果我预计会出现问题(即亚洲字符集),一切似乎都可以正常工作,例如"title": "ナガレテユク・・・"

问题:

  1. 这是一些 flickrAPI 的奇怪之处还是用于响应的正确 JSON 编码?或者它是正确编码的 JSON,而 GSON 未能将此响应“重新组装”成原始的“ü”。还是标题信息的作者只是把它搞砸了?
  2. 我该如何解决这个问题(如果是 JSON 或 GS​​ON 搞砸了,如果是作者的话,显然无法做任何事情)。我怎么知道哪些“其他”字符受到影响(ö 和 ä 浮现在脑海中,但可能还有更多“特殊情况”)。

【问题讨论】:

    标签: json gson diacritics


    【解决方案1】:

    你看到的是Unicode decomposition的情况:

    像德语变音符号这样的字符可以用两种方式表达:

    • 作为单个字符的更传统的预组合形式ü
    • 以分解形式作为基本字符u,后跟combining diaeresis̈_(我必须在此处使用下划线使其显示出来,因为它不应该独立存在,它实际上只是“悬停点” ")

    如果您收到这样的内容,可以使用java.text.Normalizer(自 Java 1.6 起提供)轻松将其转换为预先组合的形式:

    String decomposed = "Mitgef\u0308hl";
    printChars(decomposed); // Mitgefühl -- [M, i, t, g, e, f, u, ̈, h, l]
    String precomposed = Normalizer.normalize(decomposed, Form.NFC);
    printChars(precomposed); // Mitgefühl -- [M, i, t, g, e, f, ü, h, l]
    
    // Normalizing with NFC again doesn't hurt:
    String precomposedAgain = Normalizer.normalize(precomposed, Form.NFC);
    printChars(precomposedAgain); // Mitgefühl -- [M, i, t, g, e, f, ü, h, l]
    ...
    
    static void printChars(String s) {
      System.out.println(s + " -- " + Arrays.toString(s.toCharArray()));
    }
    

    如您所见,将NFC 应用于已经预先组合的字符串并没有什么坏处。

    请注意,在任何支持 Unicode 的终端上打印 String 都会正确显示,只有当您打印字符数组时,您才能看到分解形式和预组合形式之间的区别。

    一个可能的来源可能是 MacOS,它倾向于以分解的形式对事物进行编码,但奇怪的是 Flickr 并没有对这些东西进行规范化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2021-09-07
      • 2011-06-15
      • 2016-08-06
      相关资源
      最近更新 更多