iPhone解析非UTF-8的XML
2010-09-28 22:51
183 查看
做iPhone的网络应用,处理XML是家常便饭,NSXMLParser用起来还是得心应手的。不过这个东西,处理非UTF-8,会解析失败。这篇文章就是想和大家一起分享一些这方面开发的新的。
我们在某个RSS地址,可以得到下面这样的XML文件。我这里只是截取一段,---------------------------------------
<?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>
<item>
<title><![CDATA[衞生署要求浸會醫院4周內 就產婦死亡個案提交報告 ]]></title>
<link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/20091011/news_20091011_55_618483.htm]]></link>
<description><![CDATA[
衞生署昨晚已經收到浸會醫院通知,有一宗產婦死亡個案,浸會醫院需要在4星期內向衞生署提交報告,案件亦交由死因庭跟進。
衞生署數字顯示,由07年至今年8月,共接獲97宗私家醫院醫療事故的通報。去年發生的事故中,最多的是進行手術或介入程序期間出現併發症,其次還有孕婦及產婦死亡,或與孕婦在分娩過程中,生產時,或產後出現嚴重併發症;部份則包括初生嬰兒出現死亡或嚴重受傷;錯誤為病人或身體部位進行外科或介入手術程序等。
]]></description>
<pubDate>
Sun, 11 Oct 2009 14:50:46 +0800
</pubDate>
</item>
</channel>
</rss>
----------------------------------------
这是一个很常用的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,代码如下:
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:@"<?xml version=/"1.0/" encoding=/"big5/"?>"
withString:@"<?xml version=/"1.0/" encoding=/"UTF-8/"?>"]; //
[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:@"<?xml version=/"1.0/" encoding=/"big5/"?>" withString:@"<?xml version=/"1.0/" encoding=/"UTF-8/"?>"]; //[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新闻了。因为这是一个客户项目,不过我可以给各小截图大家看看:
文章转自:http://ankyhe.javaeye.com/blog/493525 版权归博主所有
相关文章推荐
- iPhone解析非UTF-8的XML
- iPhone解析非UTF-8的XML
- 主题:iPhone解析非UTF-8的XML
- iPhone解析非UTF-8的XML
- [iphone]XML 解析 之 TBXML 介绍
- iPhone HTTP获得XML并使用GDataXML解析
- iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)
- iPhone开发技巧之网络篇(1)--- 解析XML
- 解决NSXmlParser无法解析非utf-8编码的XML问题的方法
- iPhone开发中的XML解析类库对比
- iPhone中两种XML解析方式NSXMLParser和GDataXMLNode
- iphone开发之iphone解析xml&json-1
- iphone XML解析的基本流程
- iPhone开发 解析xml NSData xml
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
- iPhone/iPad 开发: 解析本地/网络上的xml文件
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
- Iphone开发之xml解析流程小结
- [转载][iPhone]XML文件解析 parsing-xml-files NSXMLParser
- iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)