iOS utf-8编码问题

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

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

NSLog(@"%@",html)返回null为什么会发生这种情况?

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

  • 下载html(作为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 JavaScriptvariables的设置中。

如果我们认为你的编码是错误的,那么在这些情况下,典型的build议就是使用stringWithContentOfURLusedEncoding参数(即不是猜测编码是什么,让NSString为你确定)。

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

不幸的是,在这种情况下,甚至失败(可能是因为文件声称是UTF8,但不是)。

那么问题就变成了“好的,我现在该怎么办”。 这取决于您为什么试图在应用程序中下载该HTML,无论如何。 如果你真的需要将它转换为UTF8(即去掉非UTF8字符),理论上你可以得到GNU iconv(3) 函数 ,它是libiconv 库的一部分。 这可以确定你可能会删除不符合要求的angular色。 这是一个问题,你愿意处理这个不合格的网页有多less工作。