做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] 將第一行轉換成
第二個轉換不難,只要我們有nsstring物件。第乙個轉換要用到cfstringref,**如下:
cpp**
cfstringref big5str = cfstringcreatewithbytes(null,
[indata bytes],
[indata length],
kcfstringencodingbig5_hkscs_1999,
false); //[a]
if (null == big5str) {
return nil;
else {
nsstring *big5nsstring = (nsstring *)big5str;
nsstring *utf8nsstring = [big5nsstring stringbyreplacingoccurrencesofstring:@""
withstring:@""]; //[b]
return [utf8nsstring datausingencoding:nsutf8stringencoding]; //[c]
cfstringref big5str = cfstringcreatewithbytes(null,
[indata bytes],
[indata length],
kcfstringencodingbig5_hkscs_1999,
false); //[a]
if (null == big5str) {
return nil;
else {
nsstring *big5nsstring = (nsstring *)big5str;
nsstring *utf8nsstring = [big5nsstring stringbyreplacingoccurrencesofstring:@""
withstring:@""]; //[b]
return [utf8nsstring datausingencoding:nsutf8stringencoding]; //[c]
思路就是先把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...