linux无法解析xml文件内容,iOS开发:解决NSXmlParser无法解析非utf-8编码的XML问题的方法...

ios开发中经常会用到解析XML,但是iOS提供的NSXmlParser只能解析encoding是utf-8的XML文件。即xml文件开头必须是

在中文网页中,经常会碰到gb2312或GBK编码的XML文件,如

当iphone开发中的NSXMLParser碰到非utf-8编码时,会直接触发parser:parseErrorOccurred:,返回的错误编码是31,之后直接退出。

解决这个问题的思路当然是把非utf-8编码转换为utf-8编码,这个功能可以通过NSString类进行转换。

问题在于如何判断文件的编码是什么。这一问题的解决思路在于ASCII码在任何编码方式下都是一样的,这样,只要将XML文件开头的若干字节(大部分XML文件的Encoding在头部前面位置)内容直接当成utf-8编码读出来,可以从中检索是否有您要转换的编码。

以处理GB2312编码转换为例:

//取XML文件的前40个字节

NSData * xmldata = [self.ItemData subdataWithRange:NSMakeRange(0,40)];

//以UTF-8编码进行解码

NSString *xmlstr = [[NSString alloc] initWithData:xmldata encoding:NSUTF8StringEncoding];

//NSLog(@"XML HEADER: %@", xmlstr);

//搜索GB2312,如果找到,就对整个文件进行编码转换

if ([xmlstr rangeOfString:@"\"GB2312\"" options:NSCaseInsensitiveSearch].location != NSNotFound)

{

//   NSLog(@"GB2312 encoding founded.");

NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSString *utf8str = [[[NSString alloc] initWithData:self.ItemData encoding:enc] autorelease];

utf8str = [utf8str stringByReplacingOccurrencesOfString:@"\"GB2312\"" withString:@"\"utf-8\"" options:NSCaseInsensitiveSearch range:NSMakeRange(0,40)];

NSData *newData = [utf8str dataUsingEncoding:NSUTF8StringEncoding];

self.ItemData = newData;

}

最后提下我碰到的一个有意思的问题,即有时候下载的XML文件被HTML Process过了。我发现原因可能是URL中的大小写问题。如http://news.163.com/special/00011K6L/rss_newstop.xml这个地址,如果K6L变成k6l,下载的XML文件就变了,大家可以试试.

如果用HPPLE解析HTML,碰到中文GB2312或GBK编码的网页,要先用gb编码解码,然后替换其中的gb字符串,再用utf8编码成data给parser就能解析中文网页了。0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值