`

iPhone解析非UTF-8的XML

阅读更多

做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[

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

 

 

 

&#34910;生署數字顯示,由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,代码如下:

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文件里面还有&#34910这样的东西。这个是繁体中文”衛“字,我们如果不处理这个东西,显示给用户看得就是&#34910,这显然是不行的。这个其实也好办,只需要用下面这句话就可以把一个number转成NSString了:

[NSString stringWithFormat:@"%C", number]

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


  • 大小: 67.2 KB
分享到:
评论
3 楼 canco 2009-11-14  
不错,不过写一个xml parser更灵活些。
2 楼 lordhong 2009-10-20  
学到好东西了, 呵呵, ^_^
1 楼 哇你长得真高 2009-10-19  
谢谢分享

相关推荐

    Objective-c对象组装XML

    [xmlString appendString:@"&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;"]; [self getNodeStr:self string:xmlString]; return xmlString; } -(void)getNodeStr:(XmlNode *)node string:(NSMutableString *)str...

    Android XML数据解析简单示例

    1、创建XML数据 ...xml version=”1.0″ encoding=”utf-8″?&gt;    ”1″&gt;Android  ”2″&gt;IPhone   2、XML解析代码 代码如下: import java.io.IOException; import java.io.InputStream; import

    ZenCoding语法手册

    &lt;meta charset="UTF-8"&gt; ``` - **HTML 4.01 Transitional文档示例** ```plaintext html:4t ``` **生成结果** ```html &lt;!DOCTYPE ...

    关于anroid的案例测试

    parser.setInput(is, "UTF-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: // 处理开始标签 break; ...

    iphone textReader源码

    同时,还需要设置读取的编码方式,如UTF-8、ASCII等。 2. **缓冲区管理**:为了提高读取效率,TextReader可能会使用缓冲区来存储临时读取的数据。缓冲区大小的选择会影响性能,过大可能导致内存消耗过多,过小则...

    android界面效果全汇总

    &lt;?xml version="1.0" encoding="utf-8"?&gt; android:interpolator="@android:anim/decelerate_interpolator"&gt; android:fromYScale="2.0" android:toYScale="1.0" android:pivotX="50%p" android:pivotY="50%p" ...

    android界面开发

    &lt;?xml version="1.0" encoding="utf-8"?&gt; Android:interpolator="@android:anim/decelerate_interpolator"&gt; Android:fromYScale="2.0" android:toYScale="1.0" Android:pivotX="50%p" android:pivotY="50%p...

    xcode4.3 4.4_免证书开发调试并构建ipa.doc

    entitlements = """&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0"&gt; """ ``` - 该脚本通过命令行参数接收应用名称和目标文件名,并根据这些信息生成entitlements...

    iPhone wap浏览器之界面架构篇

    在iPhone平台上,默认使用的中文编码格式为UTF-8,而在网络请求中接收到的数据可能是ASCII或其他编码格式。因此,在处理解析出的tag之前,需要进行编码转换。例如,文中给出的转换示例: ```objective-c [[NSString ...

    Soap请求查询手机号归属地(iPhone源代码)

    charset=utf-8”。 3. **发送请求**: 使用NSURLSession发送请求,监听其完成和失败回调,获取服务器返回的SOAP响应。 4. **解析响应**: SOAP响应同样是一个XML字符串,需要解析出归属地信息。可以使用NSXMLParser...

    HTML head 头标签详细介绍

    例如,`&lt;meta charset="utf-8"&gt;`定义了文档的字符编码为UTF-8,确保网页内容能正确显示各种语言。在HTML5中,推荐使用`&lt;meta charset&gt;`而非旧式的`&lt;meta http-equiv="Content-Type"&gt;`。 此外,`&lt;meta&gt;`标签还可以...

    利用python爬取斗鱼app中照片方法实例

    data_info_encoded = urllib.parse.urlencode(data_info).encode('utf-8') # 发送请求 request = urllib.request.Request(url, data=data_info_encoded) request.add_header('Referer', '...

    JAVA上百实例源码以及开源项目源代码

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    IOS 程序使用urlconnection连接服务器方法

    if let jsonString = String(data: data, encoding: .utf8) { print("Received JSON: \(jsonString)") } } } // 开始任务 task.resume() ``` #### 六、处理请求结果 上述示例中,通过`dataTask`方法发送了一...

Global site tag (gtag.js) - Google Analytics