1

我尝试使用 UTF-8 字符集获取 html 页面

NSString *html=[NSString stringWithContentsOfURL:[NSURL URLWithString:  @"http://forums.drom.ru/general/t1151288178.html"] encoding:NSUTF8StringEncoding error:&error]);

但是NSLog(@"%@",html)返回 null 为什么会这样?

4

1 回答 1

1

问题是,虽然文件的元标记声称是 UTF8,但它不是(至少不完全是)。您可以通过以下方式确认:

  • 下载html(as NSData,成功):

    NSError *error = nil;
    NSURL *url = [NSURL URLWithString:@"http://forums.drom.ru/general/t1151288178.html"];
    NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *filename = [docsPath stringByAppendingPathComponent:@"test.html"];
    [data writeToFile:filename atomically:YES];
    
  • 从Terminal命令行运行iconv,会报错(包括行号和字符号):

    iconv -f UTF-8 test.html > /dev/null
    

    感谢Torsten Marek与我们分享这一点。

当我查看 HTML 的那部分时,那里肯定没有 UTF8 字符,隐藏在clever_cut_patternJavaScript 变量的设置中。

如果我们认为您只是弄错了编码,那么在这些情况下,典型的建议通常是使用stringWithContentOfURL带有usedEncoding参数的演绎版(即,与其猜测编码是什么,让我们NSString为您确定这一点):

NSStringEncoding encoding;
NSString *html = [NSString stringWithContentsOfURL:url usedEncoding:&encoding error:&error];

不幸的是,在这种情况下,即使这样也失败了(可能是因为文件声称是 UTF8,但不是)。

然后问题变成“好的,那我现在该怎么办”。无论如何,这取决于您尝试在应用程序中下载该 HTML 的原因。如果您确实需要将其转换为 UTF8(即去除非 UTF8 字符),理论上您可以获取 GNUiconv(3) 函数,它是libiconv 的一部分。这可以识别您可能可以删除的不合格字符。这是一个你愿意做多少工作来处理这个不合格的网页的问题。

于 2013-08-11T07:50:51.263 回答