网络编程 图文处理 Java开发 .Net开发Apple 开发
返回首页

iPhone解析非UTF-8的XML

时间:2010-06-25 11:17来源: 作者:编程狂 点击:
做iPhone的网络应用,处理XML是家常便饭,NSXMLParser用起来还是得心应手的。不过这个东西,处理非UTF-8,会解析失败。这篇文章就是想和大家一起分享一些这方面开发的新的

做iPhone的网络应用,处理XML是家常便饭,NSXMLParser用起来还是得心应手的。不过这个东西,处理非UTF-8,会解析失败。这篇文章就是想和大家一起分享一些这方面开发的新的。

泠云工作室

       我们在某个RSS地址,可以得到下面这样的XML文件。我这里只是截取一段,

copyright lyttzx.com

 

copyright lyttzx.com

---------------------------------------

泠云工作室

  泠云工作室

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

泠云工作室

<rss version="2.0"> 本文来自泠云天天在线

<channel>

本文来自泠云天天在线

<title>RTHK On Internet - 即 時 新 聞</title> 内容来自泠云天天在线

<link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/]]></link>

泠云工作室

<description>RTHK On Internet - 即 時 新 聞</description> 本文来自泠云天天在线

<pubDate>Sun, 11 Oct 2009 15:02:02 +0800</pubDate>

本文来自泠云天天在线

  lyttzx.com

<item> 内容来自泠云天天在线

<title><![CDATA[&#34910;生署要求浸會醫院4周內 就產婦死亡個案提交報告   ]]></title>

copyright lyttzx.com

<link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/20091011/news_20091011_55_618483.htm]]></link> 本文来自泠云天天在线

<description><![CDATA[

本文来自泠云天天在线

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

 

copyright lyttzx.com

 

lyttzx.com

  copyright lyttzx.com

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

  泠云工作室

 

lyttzx.com

]]></description>

lyttzx.com

<pubDate> copyright lyttzx.com

Sun, 11 Oct 2009 14:50:46 +0800

copyright lyttzx.com

</pubDate> copyright lyttzx.com

</item> 泠云工作室

 

内容来自泠云天天在线

</channel>

lyttzx.com

</rss>

copyright lyttzx.com

----------------------------------------

本文来自泠云天天在线

这是一个很常用的RSS返回的XML,是繁体中文的,编码格式是big5。说编码格式是big5有两层意思: 泠云工作室

[1] 网络流返回的NSData是big5编码的。所以这样的NSData送给NSXMLParser是不能正确解析的。 copyright lyttzx.com

[2] 第一句话指明了XML文件也是用big5编码的。 内容来自泠云天天在线

  copyright lyttzx.com

对应于上面两个问题,我的解决思路是: 泠云工作室

[1] 把Big5编码的NSData转换成UTF-8编码的NSData lyttzx.com

[2] 将第一行<?xml version="1.0" encoding="big5"?>转换成<?xml version="1.0" encoding="utf-8"?> copyright lyttzx.com

 

copyright lyttzx.com

第二个转换不难,只要我们有NSString对象。第一个转换要用到CFStringRef,代码如下:

lyttzx.com

 

泠云工作室

Cpp代码 复制代码
  1. CFStringRef big5Str = CFStringCreateWithBytes(NULL,   
  2.                                     [inData bytes],   
  3.                                     [inData length],   
  4.                                     kCFStringEncodingBig5_HKSCS_1999,   
  5.                                     false); //[A]   
  6. if (NULL == big5Str) {   
  7.         return nil;   
  8. }   
  9. else {   
  10.     NSString *big5NSString = (NSString *)big5Str;   
  11.     NSString *utf8NSString = [big5NSString stringByReplacingOccurrencesOfString:@"<?xml version=\"1.0\" encoding=\"big5\"?>"    
  12.                            withString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; //[B]   
  13.     return [utf8NSString dataUsingEncoding:NSUTF8StringEncoding]; //[C]   
  14. }  

 思路就是先把NSData转成CFStringRef的对象[A], 然后这个对象再转成UTF-8的NSData [C],这就解决了问题[1]

lyttzx.com

中间的[B]就解决了问题[2]。这里要注意两个问题: lyttzx.com

(1)如果你的XML编码是GBK,或者GB23120或者其他的,kCFStringEncodingBig5_HKSCS_1999要换成你对应的编码方式。

copyright lyttzx.com

(2)如果你的XML编码也是big5的,也许kCFStringEncodingBig5_HKSCS_1999并不适合你的应用。因为对应big5的编码常量还有两种,他们是: lyttzx.com

kCFStringEncodingBig5_E copyright lyttzx.com

kCFStringEncodingBig5。 内容来自泠云天天在线

这个你可以查阅帮助文档,然后一个个试。

泠云工作室

  lyttzx.com

然后把return的NSData送到NSXMLParser,就可以正确解析了。可是还没有结束,大家仔细看看XML文件里面还有&#34910这样的东西。这个是繁体中文”衛“字,我们如果不处理这个东西,显示给用户看得就是&#34910,这显然是不行的。这个其实也好办,只需要用下面这句话就可以把一个number转成NSString了:

lyttzx.com

  lyttzx.com

[NSString stringWithFormat:@"%C", number] copyright lyttzx.com

这个number就是34910,是一个整数,十进制的整数(不是十六进制的)。到这里,整个处理过程就OK了,我们就可以正确得到Big5的RSS新闻了。因为这是一个客户项目,不过我可以给各小截图大家看看: 泠云工作室


本文来自泠云天天在线

(责任编辑:泠云)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
发布者资料
编程狂 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:2009-10-07 08:10 最后登录:2010-09-09 15:09
推荐内容