NSXMLParserInvalidCharacterError#9

这是我在遇到一个奇怪的角色时遇到的错误(比如复制并从文字粘贴到网络表单的引号,最终在Feed中)。我正在使用的Feed没有给出编码,他们没有希望让他们改变它。这就是我在标题中得到的全部内容:

LT <!>; ?xml version = <!> quot; 1.0 <!> quot;?<!> gt; LT <!>; rss version = <!> quot; 2.0 <!> quot; <!> gt;

解析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,因此您可以尝试一种接一种的编码,直到找到转换的编码。这并不保证您可以正确转换所有字符,但如果您的Feed源没有正确地发送编码的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.)检查字节顺序标记的响应数据的开头如果找到,请尝试指示的编码

3.)查看前两个字节;如果你找到一个空白字符或'<!> lt;'与nul / zero字符配对,尝试UTF-16(类似地,你可以检查前四个字节,看看你是否有UTF-32)

4。)扫描数据的开头,查找<?xml ... ?>处理指令并在其中查找encoding='something';尝试编码。

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

6。)如果以上都不起作用,您可以尝试删除大于127的所有字节(或替换'?'或其他ASCII字符)并使用ASCII编码转换数据。

如果此时没有NSString,则应该失败。如果你有一个NSString,你应该在encoding处理指令中寻找CFStringConvertIANACharSetNameToEncoding()声明(如果你还没有在步骤4中)。如果它在那里,你应该使用该编码将NSString转换回NSData;如果它不在那里,你应该使用UTF-8编码转换回来。

此外,CFStringConvertEncodingToNSStringEncoding()Content-Type函数可以帮助从<=>标题或<=>处理指令获取与编码名称一致的NSStringEncoding。

您也可以从xml中删除该编码行,如下所示:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top