2011-02-11 66 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];