2010-07-09 95 views
3

我正在解析来自Facebook的输入流。我使用的是类似在输入流中解码 u0000 Unicode的更优雅的方式

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

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

该流似乎已经使用ASCII编码的Unicode字符,因此我会看到诸如\ u00e4(其实是两个离散的ASCII字符)。现在,我正在捕捉“\ u”并解码后面的两个十六进制字节,将它们转换为char并用它们替换字符串,这显然是最糟糕的方式。

我确定有一种很酷的方式来使用本地函数来解码特殊字符,因为正在读取流(我希望它可以在InputStreamReader图层上完成)。但是如何?

+1

你要解析哪个URL,以便我们看到/验证你的输入?这是JSON,有机会吗? – Thanatos 2010-07-09 04:53:23

+0

这是Facebook的愚蠢的新系统与他们的图形API。看起来像这样: {“data”:[{“name”:“Thanatos”,“id”:“1234”},{“name”:“Max \ u00e4”,“id”:“5678” }]} – EboMike 2010-07-09 05:54:13

+0

@Thanatos:是的,它是,顺便说一句。 JSON的解析器可以正确处理它。我吮吸。 – EboMike 2010-10-19 04:43:33

回答

5

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

2

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

但是,这并没有回答你关于什么是正确的Android读取数据的方式的问题,并且你是对的,可能有一个。

+0

是的,它本质上是6个字节(好吧,实际上12个字节,考虑到它在一个字符串内,所以每个字符都是2个字节)。 而我的方法工作正常 - 我读它作为一个16位值并将其用作字符。但由于我在Java中完成这项工作,并随时更换字符串,因此存在大量的JVM和内存管理开销。在解析时本地执行此操作会更快。 – EboMike 2010-07-09 05:52:09