【问题标题】:Convert ASCII representation of unicode to unicode将 unicode 的 ASCII 表示转换为 unicode
【发布时间】:2015-05-08 09:29:33
【问题描述】:

我有一个通过 JSON 获取 som 字符串的应用程序。

问题是我认为他们将其作为 ASCII 发送,而文本确实应该是 unicode。

例如,字符串的某些部分是“\u00f6”,即瑞典字母“ö”

例如,“buy”的瑞典语单词是“köpa”,而我得到的字符串是“k\u00f6pa”

在我用 java 接收到这个字符串后,有没有一种简单的方法可以将它转换为正确的表示形式?

也就是说,我想将“k\u00f6pa”之类的字符串转换为“köpa”

感谢大家的帮助!

【问题讨论】:

  • 请参考How to Ask,帮助您稍微制定问题并获得更好的答案
  • 您是在编写自己的 JSON 解析器还是您使用的库有问题?为什么你认为文本应该包含 Unicode 字符? Unicode 转义序列在 JSON 字符串中有效。
  • 在你做任何事情之前非常确保在接收到 JSON 并将其放入 Java String 对象之后,individual 字符 "\u00f6 " 存在于字符串中。不要相信调试器或诊断转储会向您显示实际的 Unicode 字形,因为它们通常会将内容转换为转义序列以在非多语言显示器上显示。很多精力都浪费在这个领域,修复没有损坏的东西。

标签: java unicode non-ascii-characters


【解决方案1】:

嗯,这很简单,只需使用 JSON 库即可。以杰克逊为例,您将:

final ObjectMapper mapper = new ObjectMapper();

final JsonNode node = mapper.readTree(your, source, here);

JsonNode 实际上是TextNode;您可以将文本检索为:

node.textValue()

请注意,这不是字符串的“ASCII 表示”;碰巧 JSON 字符串可以包含像这样的 UTF-16 代码单元字符转义。

(虽然你会丢失值周围的引号,但这可能是你所期望的)

【讨论】:

    【解决方案2】:

    十六进制代码只是 2 个字节的整数,int 可以处理得很好——所以你可以使用Integer.parse(s, 16),其中s 是不带"\u" 前缀的字符串。然后,您只需将 int 缩小为 char,保证适合。

    输入一些正则表达式(验证字符串并提取十六进制代码),就完成了。

    Pattern p = Pattern.compile("\\\\u([0-9a-fA-F]{4})");
    Matcher m = p.matcher(arg);
    if (m.matches()) {
      String code = m.group(1);
      int i = Integer.parseInt(code, 16);
      char c = (char) i;
      System.out.println(c);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-17
      • 2011-07-28
      • 2020-02-20
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多