Jaffe的分享空間 Rotating Header Image

再戰Java Programming!

對上一次寫java日記,竟然已經係一年前…

唔經唔覺,放低左java(亦即係學android programming)成年… 原因係之前公司太忙,忙到夜晚返屋企後根本提唔起勁去睇書,更莫講話坐定定在部腦前慢慢寫,慢慢試…

無返工後,可以做更多更有意義既事… 環台旅行,農暦年假,進修大考過後… 趁找工作前的空檔,重上寫app的學習軌道…

full time學習, 進度非常理想… 第三日已邁向web services運作…

原本利用XmlPullParserFactory, InputStreamReader, getUrlData, DefaultHttpClient, HttpGet已經完全可以存取我需要用的所有數據,但從今日12點開始,我就一直被個怪問題纒擾:

用XmlPullParser嘗試去解釋一個xml檔時,竟然不斷卡在一個exception上:

org.xmlpull.v1.XmlPullParserException: Unexpected token (position: @1:2 in java.io.InputStreamReader@410b7d70)

百思不得其解,因為同一個xml檔,利用xcode的parser可以順利地轉換為數據,但java的XmlPullParser就不能成功…

在網上做了一輪資料搜集,發覺亦有不少”苦主”, 亦是跟同我一樣遇到這問題,有些歸疚encoding,但我應該就唔係呢個問題…

呢個exception,大約意思就係XmlPullParser在xml檔內最開頭位置搵唔到需要既xml tag <?xml>,引致無法運作…

但我已經多番確定xml內容正確,檔案開頭肯定是<?xml…>

經不斷trial and error,竟然發現檔案第一個character真係唔係 “<” 字符 (<?xml的第一個字符)…

而係一個肉眼都睇唔到既character, ascii code係65279…

google真利害,一下就查到佢既身份… 原來呢個character係有名的… 叫byte-order mark (BOM)… 詳情就唔談論了… 但就係呢個字符,令到XmlPullParser唔能夠正常運作…

首要任務,就係諗方法點鏟除佢… 方法不外乎 1) 從原始xml檔內刪除 2) java讀入後刪除

但兩個方法,都各有疑慮… 第1)個方法,因為產生xml檔的程式仍然在運作(供data予iPhone電視節目表使用),所以胡亂改動有一定風險… 第2)個方法是因為不太熟java的class,所以仍需要更多時間研究…

所以,花費了近6小時… 仍然未找到解決方法… 趁休息時寫了這篇blog…

後記:

經過幾翻努力,在網上找到不少討論UTF-8 BOM既文章,可惜偏偏缺乏比較好既解決方法,終於在成鐘頭既重要搜索,搵到呢篇無乜解釋既source code,移值過自己program後,竟然真係解決到,在此嗚謝呢位作者! (佢應該唔識睇中文,就單簡講句thanks!吧,如佢有緣見到自己既source code在我blog出現)

http://android.svn.wordpress.org/tags/1.4.1/src/org/wordpress/android/viewStats.java

最重要既部份如下:

PushbackInputStream is = new PushbackInputStream(entity.getContent());

// get rid of junk characters before xml response. 60 = ‘<‘. Added
// stopper to prevent infinite loop

int bomCheck = is.read();
int stopper = 0;

while (bomCheck != 60 && stopper < 20) {
bomCheck = is.read();
stopper++;
}

is.unread(bomCheck);

pullParser.setInput(is, “UTF-8”);

呢段珍貴既code又帶我重回直路了…

寫program真係好有挑戰性, 途中一定會遇到困難,但刻服到嗰刻,個心又真係有無窮喜悅!

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: