如何更改UIWebView中的字符编码?

问题摘要:浏览iOS中未使用UIWebView显式指定正确字符编码的非英文网站时,页面无法正确显示。

详细解释:由于UIWebView中的loadRequest:方法将使用从Web服务器发送的charset头中指定的编码或写在HTML元标记中的字符集,并且默认为iso-8859-1(好吧,我不太确定关于这个)当字符集没有被指定时,导致非英文网站无法正常显示。

我曾尝试Google改变UIWebView使用的字符集,但唯一的方法是使用loadData:MIMEType:textEncodingName:baseURL:方法来指定编码名称。

但是,使用loadData:MIMEType:textEncodingName:baseURL: + NSURLConnection代替loadRequest:并不是一个好主意,因为UIWebView将不会调用委托方法webView:shouldStartLoadWithRequest:navigationType:对于框架,即使我们find了方法要在UIWebView加载框架时得到通知,我们不能调用loadData:MIMEType:textEncodingName:baseURL:加载框架内容,因为它会加载框架作为外部页面,如果我们这样做。

此外,我试图使用JavaScript黑客,但似乎属性是只读的,不能改变。

 [webView stringByEvaluatingJavaScriptFromString:@"document.characterSet='utf-8';"]; 

另一个解决方法是向HTML中插入元标记,并要求UIWebView加载修改后的代码,但上面提到的框架问题也适用于此处。

 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 

问:是否有更好的解决scheme,可以更改UIWebView中加载的网页中的字符编码,并正确处理帧?

您可以通过手动加载HTML,修改它,然后将修改的内容加载到UIWebView中来完成此操作。

  • 从不包含元标记的页面手动加载HTML到一个string(例如使用NSURLConnection
  • 使用string操作,将适当的编码元标记插入到手动加载的HTML中
  • 使用loadHTMLString:将web视图中的HTML设置为修改后的stringloadHTMLString:

现在,这对于不包含链接的网页来说可以正常工作。 如果它包含链接,那么你会发现,他们点击一个链接后,新的页面将不会有你的修改。 因此,您需要手动拦截所有的点击。 你可以这样做:

  • 实现一个UIWebView委托
  • 实现方法webView:shouldStartLoadWithRequest:navigationType:
  • 在您的委托方法中,手动加载URL并在将其设置到UIWebView之前修改内容,如上所述。

这就是我所做的,
首先找出它是否是文本,如果是,我得到的数据,设置编码,并加载它使用UIWebView>loadData:MIMEType:textEncodingName:baseURL
这里是代码:

  1. 获取发送同步HEAD请求的MIMEType。
    我们希望使用一个足够快的HEAD HTTP请求。
    而且我们想要同步请求的原因有两个,我们需要请求的结果继续,并且我们希望避免像这样的并发请求问题。

     NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url]; [headRequest setHTTPMethod:@"HEAD"]; NSHTTPURLResponse *headResponse; NSError *error = nil; [NSURLConnection sendSynchronousRequest:headRequest returningResponse:&headResponse error:&error]; if (error != nil) { NSLog(@"loadURLWithString %@",[error localizedDescription]); } NSString *mimeType = [headResponse MIMEType]; 


  2. 那么如果是文本,则使用UIWebView> loadData:MIMEType:textEncodingName:baseURL加载它
    为了保持应用程序响应,build议将下面的代码放到一个块中并在GCD队列中运行。

     if([mimeType rangeOfString:@"text" options:NSCaseInsensitiveSearch].location == 0) { [wview loadData:[NSData dataWithContentsOfURL: url] MIMEType:mimeType textEncodingName:encoding baseURL:nil];