的NSXMLParser RSS问题NSXMLParserInvalidCharacterError

问题描述:

NSXMLParserInvalidCharacterError#9的NSXMLParser RSS问题NSXMLParserInvalidCharacterError

这是我收到的时候我打了奇怪的字符错误(如报价复制和粘贴文字的网页形式,即最终在饲料中)。我正在使用的Feed没有给出编码,他们没有希望让我改变它。这是我在标题中得到:?

< XML版本= “1.0”> < RSS版本= “2.0”>

我能做些什么非法字符解析饲料的时候?我在分析之前是否扫描数据? API中缺少什么?有没有人处理过这个问题?

NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease]; 

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

固定我的问题......

+0

我讨厌与编码XD战斗比你它很好地工作 – 2012-05-10 14:09:07

NSString的-initWithData:encoding:方法返回nil如果失败了,所以你可以尝试一个又一个编码,直到你找到一个转换。这并不能保证你能正确地转换所有的字符,但是如果你的源代码没有给你发送正确的编码XML,那么你可能不得不忍受它。

的基本思路是:

// try the most likely encoding 
NSString xmlString = [[NSString alloc] initWithData:xmlData 
              encoding:NSUTF8StringEncoding]; 

if (xmlString == nil) { 
    // try the next likely encoding 
    xmlString = [[NSString alloc] initWithData:xmlData 
            encoding:NSWindowsCP1252StringEncoding]; 
} 

if (xmlString == nil) { 
    // etc... 
} 

是通用和强大的,你可以做以下直至成功:

1)尝试在HTTP的Content-Type头指定的编码响应(如果有的话)

2.)检查所述响应数据的开始要byte order mark,如果找到,尝试所指示的编码

3.)看看前两个字节;如果你发现一个空白字符'<'与一个空/零字符配对,试试UTF-16(同样,你可以检查前四个字节看看你是否有UTF-32)

4.)扫描开始寻找<?xml ... ?>处理指令数据,寻找encoding='something'里面;尝试该编码。

5.)尝试一些常见的编码。如果您的数据源是英文的,请绝对检查Windows Latin-1,Mac Roman和ISO Latin-1。

6)如果以上工作,你可以尝试删除所有字节大于127(或替代“?”或其他ASCII字符)和使用ASCII编码转换数据。

如果你没有通过这点一个NSString,你应该失败。如果你有一个NSString,你应该寻找在<?xml ... ?>处理指令的encoding声明(如果你在步骤4中没有的话)。如果它在那里,你应该使用该编码将NSString转换回NSData;如果不存在,则应使用UTF-8编码进行转换。

此外,CFStringConvertIANACharSetNameToEncoding()CFStringConvertEncodingToNSStringEncoding()功能可以帮助获取与编码名称变为形成Content-Type头或<?xml ... ?>处理指令的NSStringEncoding。

您也可以从XML删除编码线是这样的:

int length = str.length >100 ? 100:str.length; 
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
         withString:@"" 
         options:NSRegularExpressionSearch 
         range:NSMakeRange(0, length)];