2011-09-03 46 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'封裝它是一種方法),並且它的一些部分可以被轉換爲字符串。 –