NSXMLParserInvalidCharacterError#9
这是我在遇到一个奇怪的角色时遇到的错误(比如复制并从文字粘贴到网络表单的引号,最终在Feed中)。我正在使用的Feed没有给出编码,他们没有希望让他们改变它。这就是我在标题中得到的全部内容:
< ?xml version =“1.0”?> < rss version =“2.0”>
解析Feed时,如何处理非法字符?我在解析之前扫描数据吗?我在API中缺少什么?有人处理过这个问题吗?
答案 0 :(得分:7)
NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
修正了我的问题...
答案 1 :(得分:1)
如果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.。)检查byte order mark的响应数据的开始,如果找到,请尝试指示的编码
3.)查看前两个字节;如果你找到一个空白字符或'<'与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
处理指令中查找<?xml ... ?>
声明(如果你还没有在步骤4中)。如果它在那里,你应该使用该编码将NSString转换回NSData;如果它不在那里,你应该使用UTF-8编码转换回来。
此外,CFStringConvertIANACharSetNameToEncoding()
和CFStringConvertEncodingToNSStringEncoding()
函数可以帮助获取NSStringEncoding,该编码名称来自Content-Type
标头或<?xml ... ?>
处理指令。
答案 2 :(得分:0)
您也可以从xml中删除该编码行,如下所示:
int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\""
withString:@""
options:NSRegularExpressionSearch
range:NSMakeRange(0, length)];