iPhone解析非UTF 8的XML

2021-08-30 06:13:15 字數 1879 閱讀 6075

做iphone的網路應用,處理xml是家常便飯,nsxmlparser用起來還是得心應手的。不過這個東西,處理非utf-8,會解析失敗。這篇文章就是想和大家一起分享一些這方面開發的新的。

我們在某個rss位址,可以得到下面這樣的xml檔案。我這裡只是擷取一段,

<?xml version="1.0" encoding="big5"?>

rthk on internet - 即 時 新 聞

rthk on internet - 即 時 新 聞

sun, 11 oct 2009 15:02:02 +0800

衞生署昨晚已經收到浸會醫院通知,有一宗產婦死亡個案,浸會醫院需要在4星期內向衞生署提交報告,案件亦交由死因庭跟進。

衞生署數字顯示,由07年至今年8月,共接獲97宗私家醫院醫療事故的通報。去年發生的事故中,最多的是進行手術或介入程式期間出現併發症,其次還有孕婦及產婦死亡,或與孕婦在分娩過程中,生產時,或產後出現嚴重併發症;部份則包括初生嬰兒出現死亡或嚴重受傷;錯誤為病人或身體部位進行外科或介入手術程式等。

]]>

sun, 11 oct 2009 14:50:46 +0800

這是乙個很常用的rss返回的xml,是正體中文的,編碼格式是big5。說編碼格式是big5有兩層意思:

[1] 網路流返回的nsdata是big5編碼的。所以這樣的nsdata送給nsxmlparser是不能正確解析的。

[2] 第一句話指明了xml檔案也是用big5編碼的。

對應於上面兩個問題,我的解決思路是:

[1] 把big5編碼的nsdata轉換成utf-8編碼的nsdata

[2] 將第一行<?xml version="1.0" encoding="big5"?>轉換成<?xml version="1.0" encoding="utf-8"?>

第二個轉換不難,只要我們有nsstring物件。第乙個轉換要用到cfstringref,**如下:

cfstringref big5str = cfstringcreatewithbytes(null,

[indata bytes],

[indata length],

kcfstringencodingbig5_hkscs_1999,

false); //[a]

if (null == big5str)

else

思路就是先把nsdata轉成cfstringref的物件[a], 然後這個物件再轉成utf-8的nsdata [c],這就解決了問題[1]

中間的[b]就解決了問題[2]。這裡要注意兩個問題:

(1)如果你的xml編碼是gbk,或者gb23120或者其他的,kcfstringencodingbig5_hkscs_1999要換成你對應的編碼方式。

(2)如果你的xml編碼也是big5的,也許kcfstringencodingbig5_hkscs_1999並不適合你的應用。因為對應big5的編碼常量還有兩種,他們是:

kcfstringencodingbig5_e

kcfstringencodingbig5。

這個你可以查閱幫助文件,然後乙個個試。

然後把return的nsdata送到nsxmlparser,就可以正確解析了。可是還沒有結束,大家仔細看看xml檔案裡面還有衞這樣的東西。這個是正體中文」衛「字,我們如果不處理這個東西,顯示給使用者看得就是衞,這顯然是不行的。這個其實也好辦,只需要用下面這句話就可以把乙個number轉成nsstring了:

[nsstring stringwithformat:@"%c", number]

這個number就是34910,是乙個整數,十進位制的整數(不是十六進製制的)。到這裡,整個處理過程就ok了,我們就可以正確得到big5的rss新聞了。因為這是乙個客戶專案,不過我可以給各小截屏大家看看:

iPhone解析非UTF 8的XML

做iphone的網路應用,處理xml是家常便飯,nsxmlparser用起來還是得心應手的。不過這個東西,處理非utf 8,會解析失敗。這篇文章就是想和大家一起分享一些這方面開發的新的。我們在某個rss位址,可以得到下面這樣的xml檔案。我這裡只是擷取一段,rthk on internet 即 時 ...

utf 8 和 utf8的區別小記

utf 8 是標準寫法,php 在 windows 下邊英文不區分大小寫,所以也可以寫成 utf 8 utf 8 也可以把中間的 省略,寫成 utf8 一般程式都能識別,但也有例外 如下文 為了嚴格一點,最好用標準的大寫 utf 8 在資料庫中只能使用 utf8 mysql 在mysql的命令模式中...

utf 8與utf 8無BOM的區別

utf 8 8 bit unicode transformation format 是一種針對unicode的可變長度字元編碼,又稱萬國碼。bom byte order mark,位元組序標記 utf 8不需要bom來表明位元組順序,但可以用bom來表明編碼方式。字元 zero width no b...