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

时间:2011-02-11 19:18:43

标签: iphone ios character-encoding uiwebview

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

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

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

但是,使用loadData:MIMEType:textEncodingName:baseURL: + NSURLConnection而不是loadRequest:不是一个好主意,因为UIWebView不会为框架调用委托方法webView:shouldStartLoadWithRequest:navigationType:,即使我们发现当UIWebView加载帧时获得通知的方法,我们无法调用loadData:MIMEType:textEncodingName:baseURL:来加载帧内容,因为如果我们这样做,它将加载帧作为外部页面。

此外,我曾尝试使用javascript hack,但似乎该属性是只读的,无法更改。

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

  • 将不包含元标记的网页中的HTML手动加载到字符串中(例如,使用NSURLConnection
  • 使用字符串操作,将适当的编码元标记插入到手动加载的HTML
  • 使用loadHTMLString:
  • 将网页视图中的HTML设置为修改后的字符串

现在,这适用于不包含链接的网页。如果它包含链接,那么您会发现在点击链接后,新页面将不会进行修改。因此,您需要手动拦截所有点击。以下是您可以这样做的方法:

答案 1 :(得分:1)

这就是我的工作,
首先查看它是否是文本,如果是,我获取数据,设置编码并使用UIWebView>loadData:MIMEType:textEncodingName:baseURL加载它。
这是代码:

  1. 获取MIMEType发送同步HEAD请求 我们想要使用generally is fast enough的HEAD HTTP请求。
    我们希望同步发出请求有两个原因,我们需要继续请求的结果,并且我们希望避免并发请求问题like this

     
    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
    为了使应用程序保持响应,建议将以下代码放入块中并在GCD queue内运行。

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