NSXMLParserInvalidCharacterError#9
这是我在遇到一个奇怪的角色时得到的错误(比如复制并从单词粘贴到网络表单的引号,最终在Feed中) . 我正在使用的Feed没有给出编码,他们没有希望让他们改变它 . 这是我在 Headers 中得到的全部内容:
<?xml version =“1.0”?> <rss version =“2.0”>
解析Feed时,我该怎么办非法字符?我在解析之前扫描数据吗?我在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 ,因此您可以尝试一种接一种的编码,直到找到转换的编码 . 这并没有正确转换所有字符,但如果你的源代码不是't sending you correctly encoded XML, then you' ll可能不得不忍受它 .
-initWithData:encoding:
nil
基本思路是:
// 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' ;尝试编码 .
<?xml ... ?>
encoding='something'
5.)尝试一些常见的编码 . 如果您的数据源是英文,请务必检查Windows Latin-1,Mac Roman和ISO Latin-1 .
6.)如果以上都不起作用,您可以尝试删除大于127的所有字节(或替换'?'或其他ASCII字符)并使用ASCII编码转换数据 .
如果此时没有NSString,则应该失败 . 如果你有一个NSString,你应该在 <?xml ... ?> 处理指令中查找 encoding 声明(如果你没有't already in step 4). If it'那里,你应该使用该编码将NSString转换回NSData;如果它不存在,你应该使用UTF转换回来-8编码 .
encoding
此外, CFStringConvertIANACharSetNameToEncoding() 和 CFStringConvertEncodingToNSStringEncoding() 函数可以帮助获取NSStringEncoding,该编码名称与 Content-Type 标头或 <?xml ... ?> 处理指令一起使用 .
CFStringConvertIANACharSetNameToEncoding()
CFStringConvertEncodingToNSStringEncoding()
Content-Type
您也可以从xml中删除该编码行,如下所示:
int length = str.length >100 ? 100:str.length; NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, length)];
3 回答
解决了我的问题......
NSString
-initWithData:encoding:
方法如果失败则返回nil
,因此您可以尝试一种接一种的编码,直到找到转换的编码 . 这并没有正确转换所有字符,但如果你的源代码不是't sending you correctly encoded XML, then you' ll可能不得不忍受它 .基本思路是:
为了通用和健壮,您可以在成功之前执行以下操作:
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
声明(如果你没有't already in step 4). If it'那里,你应该使用该编码将NSString转换回NSData;如果它不存在,你应该使用UTF转换回来-8编码 .此外,
CFStringConvertIANACharSetNameToEncoding()
和CFStringConvertEncodingToNSStringEncoding()
函数可以帮助获取NSStringEncoding,该编码名称与Content-Type
标头或<?xml ... ?>
处理指令一起使用 .您也可以从xml中删除该编码行,如下所示: