我尝试使用 UTF-8 字符集获取 html 页面
NSString *html=[NSString stringWithContentsOfURL:[NSURL URLWithString: @"http://forums.drom.ru/general/t1151288178.html"] encoding:NSUTF8StringEncoding error:&error]);
但是NSLog(@"%@",html)
返回 null 为什么会这样?
问题是,虽然文件的元标记声称是 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_pattern
JavaScript 变量的设置中。
如果我们认为您只是弄错了编码,那么在这些情况下,典型的建议通常是使用stringWithContentOfURL
带有usedEncoding
参数的演绎版(即,与其猜测编码是什么,让我们NSString
为您确定这一点):
NSStringEncoding encoding;
NSString *html = [NSString stringWithContentsOfURL:url usedEncoding:&encoding error:&error];
不幸的是,在这种情况下,即使这样也失败了(可能是因为文件声称是 UTF8,但不是)。
然后问题变成“好的,那我现在该怎么办”。无论如何,这取决于您尝试在应用程序中下载该 HTML 的原因。如果您确实需要将其转换为 UTF8(即去除非 UTF8 字符),理论上您可以获取 GNUiconv(3)
函数,它是libiconv
库的一部分。这可以识别您可能可以删除的不合格字符。这是一个你愿意做多少工作来处理这个不合格的网页的问题。