【问题标题】:More elegant way to decode \u0000 Unicode in an input stream在输入流中解码 \u0000 Unicode 的更优雅的方式
【发布时间】:2011-03-13 16:49:19
【问题描述】:

我正在解析来自 Facebook 的输入流。我正在使用类似的东西

BufferedReader in =
    new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

然后in.readLine 实际从流中读取。

流似乎已经用 ASCII 编码了 Unicode 字符,所以我看到类似 \u00e4 的东西(其中 \u 实际上是两个离散的 ASCII 字符)。现在,我正在寻找“\u”并解码随后的两个十六进制字节,将它们转换为字符并用它们替换字符串,这显然是最糟糕的方法。

我确信有一种很酷的方法可以在读取流时使用本机函数来解码特殊字符(我希望它可以在 InputStreamReader 层上完成)。但是怎么做呢?

【问题讨论】:

  • 您在解析什么 URL,以便我们查看/验证您的输入?这是 JSON 吗?
  • 这是 Facebook 带有图形 API 的愚蠢的新系统。看起来像这样: {"data":[{"name":"Thanatos","id":"1234"},{"name":"Max\u00e4","id":"5678"}] }
  • @Thanatos:是的,顺便说一句。 JSON 的解析器会正确处理它。我很烂。

标签: android unicode


【解决方案1】:

数据格式是 JSON,我没有提到(Thanatos 已经假设了)。使用 Android 的 JSON 解析器将自动正确解码字符。自己解析 JSON 在多个层面上显然是一个愚蠢的想法。

【讨论】:

    【解决方案2】:

    如果您看到“\u00e4”与“\”和“u”是分开的,那么“0”、“0”、“e”和“@” 987654327@' 可能构成 2 字节(16 位)Unicode 字符的 4 个十六进制数字。该符号基于 C99;另一种方法是“\U00XXYYZZ”,其中有 8 个十六进制数字表示 32 位 UTF-32 字符(但是,由于 Unicode 是 21 位代码集,8 位数字中的前 2 位始终为 0,下一个通常(通常)也是 0)。

    但是,这并不能回答您关于什么是读取数据的正确 Android 方式的问题,您说得对,可能有一种方式。

    【讨论】:

    • 是的,它本质上是 6 个字节(好吧,物理上是 12 个字节,考虑到它在字符串中,所以每个字符是 2 个字节)。而且我的方法效果很好 - 我将其读取为 16 位值并将其用作字符。但是由于我是在 Java 中执行此操作并随时替换字符串,因此存在大量 JVM 和内存管理开销。在解析时本地执行此操作会更快。
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多