2011-02-11 29 views
21

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

详细说明:如UIWebView中的loadRequest:方法将使用在从Web服务器或写在HTML元标记的字符集,并且默认为ISO-8859-1发送的字符集头中指定的编码(以及,我不太确定这一点),当字符集没有被指定时,这会导致非英文网站无法正常显示。

我曾尝试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的改变在加载的网页的字符编码,并且帧妥善处理?

+1

请提供您的网址这里,那么让我查一下。 – 2011-11-18 07:03:16

+0

你有控制网页或服务器吗? – Magnus 2011-11-20 22:15:16

+0

@magnus会太容易了;) – Till 2011-11-24 01:41:34

回答

6

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

  • 手动使用字符串操作网页中的HTML不包含meta标签,加载到一个字符串(例如,使用NSURLConnection
  • ,插入相应的编码meta标签到手动加载HTML
  • 设置HTML在Web视图使用loadHTMLString:

现在,这将正常工作的网页,其中包含没有链接修改后的字符串。如果它包含链接,那么你会发现,他们点击一个链接后,新页面将不会被修改。因此,您需要手动拦截所有点击。这里是你如何能做到这一点:

1

这是我做的,
先看看它是文本,如果是,我得到的数据,设置编码和使用UIWebView>loadData:MIMEType:textEncodingName:baseURL加载它。
下面是代码:

  1. 获取将mimeType发送同步HEAD请求。
    我们想要使用一个HEAD HTTP请求,其中generally is fast enough
    由于两个原因,我们想要同步请求,我们需要请求的结果继续,并且我们希望避免并发请求问题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];