的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];
固定我的问题......
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)];
我讨厌与编码XD战斗比你它很好地工作 – 2012-05-10 14:09:07