详解iPhone应用程序中非UTF-8里的XML

移动开发 iOS
本文介绍的是浅谈iPhone应用程序中非UTF-8里的XML,详细的介绍了UTF-8中的XML,先来看内容。

iPhone应用程序中非UTF-8里的XML是本文要介绍的内容,主要介绍了iphone里的UTF-8XML应用,先来看详细内容。做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[&#34910;生署要求浸會醫院4周內 就產婦死亡個案提交報告   ]]></title> 
<link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/20091011/news_20091011_55_618483.htm]]></link> 
<description><![CDATA[ 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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

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

]]></description> 
<pubDate> 
Sun, 11 Oct 2009 14:50:46 +0800  
</pubDate> 
</item> 
</channel> 
</rss> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

这是一个很常用的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) {     
        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]  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

思路就是先把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。 
  • 1.
  • 2.

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

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

[NSString stringWithFormat:@"%C", number] 
  • 1.

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

详解iPhone应用程序中非UTF-8里的XML

小结:详解iPhone应用程序中非UTF-8里的XML的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-26 09:41:23

iPhone xcode Mac OS X

2011-07-19 14:36:32

iPhone

2011-07-26 16:33:56

iPhone Delegate

2011-08-10 16:50:10

iPhone生命周期

2011-07-21 10:47:37

iPhone Cocoa 委托

2011-08-25 09:43:51

UTF-8中文man

2011-08-10 16:57:15

iPhone事件程序包

2021-05-12 07:43:02

LinuxUnicodeUTF-8

2016-12-13 10:13:18

PHPUTF-8实践

2011-03-07 12:31:54

Filezilla

2020-09-21 08:56:00

GolangUnicode编码

2012-05-24 15:49:35

HTML5

2011-08-10 09:31:33

开发iPhone应用程

2011-07-26 10:09:08

iPhone 多语言 国际化

2024-05-29 13:05:44

2010-08-27 10:41:41

iPhone核心应用程序

2011-07-20 15:58:58

iPhone 应用程序 生命周期

2011-07-19 11:29:31

2011-08-12 14:54:45

iPhone委托

2011-08-05 13:49:53

iPhone 应用 开发
点赞
收藏

51CTO技术栈公众号