2011-09-03 75 views
0

我试图从服务器读取使用套接字的响应,并且信息是UTF-8编码的。我将InputStream从InputStreamReader中的套接字中编码设置为“UTF-8”。BlackBerry Socket UTF-8 InputStreamReader问题

出于某种原因,似乎只有部分响应被读取,然后读数只会持续一两分钟,然后结束。如果我将InputStreamReader上的编码设置为“ISO-8859-1”,那么我可以立即读取所有数据,但显然不是所有字符都能正确显示。

代码看起来像下面

socketConn = (SocketConnection)Connector.open(url); 
InputStreamReader is = new InputStreamReader(socketConn.openInputStream(), "UTF-8"); 

然后我在标题和内容阅读。内容被分块,我读取每个块的大小(从十六进制转换为十进制)的行,知道要读多少。

我不理解两种编码在阅读上的差异及其可能产生的效果,因为它在ISO-8859-1没有问题的情况下工作,并且它最终以UTF-8工作,只有很长的延迟。

回答

-1

我已经在运行中删除块大小,所以我最终做了一些有点类似于IOUtilities的答案。我只是使用InputStream,而不是使用InputStreamReader。 InputStream中具有读取方法,可以填补字节数组,所以对于每个块的代码看起来是这样的

byte[] buf = new buf[size]; 
is.read(buf); 
return new String(buf, "UTF-8"); 

这似乎是工作,不会造成任何延迟,我可以删除有关的额外信息在飞行中大块。

+1

一般来说,像这样解码部分UTF-8流可能会导致错误。由于每个UTF-8字符可能由多个字节组成,因此在对其任意大小的块进行解码时,最终可能会在一个块的末尾出现一个角色的第一部分,而在下一个块的开始处则会出现该角色的其余部分,在两个组块上给出错误的解码结果。在你的具体情况下,你知道每个块的大小,他们保证正确解码,所以这应该工作得很好。嗯,是的...我希望这是有道理:) – Martin

+0

这是有道理的!谢谢,这是我可能需要注意的一个角落案例。 – mparizeau

0

很难得出延迟的原因。

你可以试试从网络获取数据的另一种方式:

byte[] data = IOUtilities.streamToBytes(socketConn.openInputStream()); 

我相信上述应毫不拖延地通过。然后从网络获取字节,您可以开始数据处理。注意你总是可以得到从代表UTF-8编码的字符串字节String

String stringInUTF8 = new String(bytes, "UTF-8"); 

UPDATE:看到这个主题的第二个评论。

+0

呃,他正在谈论HTTP'Transfer-Encoding:Chunked'响应。盲目地将它完全放入一个'String'不会在没有首先剥离块头和换行符的情况下工作。另请参阅http://en.wikipedia.org/wiki/Chunked_transfer_encoding – BalusC

+0

@BalusC:只是要清楚 - 我我不是在谈论如何将整个数据字节数组转换为字符串。没有!当数据被读取时,它可以被调查(可能是用'ByteArrayInputStream'封装它是一种方法),并且它的一些部分可以被转换为字符串。 –