首页 文章

NSXMLParser rss发出NSXMLParserInvalidCharacterError

提问于
浏览
3

NSXMLParserInvalidCharacterError#9

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

<?xml version =“1.0”?> <rss version =“2.0”>

解析Feed时,我该怎么办非法字符?我在解析之前扫描数据吗?我在API中缺少什么?有人处理过这个问题吗?

3 回答

  • 1
    NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];
    
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    

    解决了我的问题......

  • 0

    NSString -initWithData:encoding: 方法如果失败则返回 nil ,因此您可以尝试一种接一种的编码,直到找到转换的编码 . 这并没有正确转换所有字符,但如果你的源代码不是't sending you correctly encoded XML, then you' ll可能不得不忍受它 .

    基本思路是:

    // 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 声明(如果你没有't already in step 4). If it'那里,你应该使用该编码将NSString转换回NSData;如果它不存在,你应该使用UTF转换回来-8编码 .

    此外, CFStringConvertIANACharSetNameToEncoding()CFStringConvertEncodingToNSStringEncoding() 函数可以帮助获取NSStringEncoding,该编码名称与 Content-Type 标头或 <?xml ... ?> 处理指令一起使用 .

  • 7

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

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

相关问题