2010-07-09 96 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