Soru UIWebView'da karakter kodlaması nasıl değiştirilir?


Sorunun özeti: İOS'ta UIWebView ile doğru karakter kodlamasını açıkça belirtmeyen İngilizce olmayan sitelere göz atarken, sayfa doğru görüntülenemiyor.

Detaylı açıklama: Olarak loadRequest: UIWebView yöntemi, web sunucusundan gönderilen karakter kümesi üstbilgisinde belirtilen kodlamayı veya HTML meta etiketinde yazılan karakter dizisini ve varsayılan olarak iso-8859-1 (küme, bu konuda çok emin değilim) karakter kümesini kullanmaz. Belirtilen, İngilizce olmayan sitelerin düzgün görüntülenememesine neden olur.

UIWebView'in kullandığı karakter kümesini değiştirmenin bir yolu için Google'ı denedim, ancak tek yolu kullanmaktır. loadData:MIMEType:textEncodingName:baseURL: kodlama adını belirtme yöntemi.

Ancak, kullanmak iyi bir fikir değildir. loadData:MIMEType:textEncodingName:baseURL: + NSURLConnection yerine loadRequest:çünkü UIWebView temsilci yöntemini çağırmaz webView:shouldStartLoadWithRequest:navigationType: kareler için ve UIWebView bir çerçeve yüklendiğinde bildirim almanın bir yolunu bulsak bile, arayamayız loadData:MIMEType:textEncodingName:baseURL: çerçeve içeriğini yüklemek için, eğer bunu yaparsak çerçeveyi dış sayfa olarak yükleyecektir.

Ayrıca, bir javascript kesmek kullanmayı denedim, ancak özellik salt okunur ve değiştirilemez gibi görünüyor.

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

Başka bir geçici çözüm, HTML'ye bir meta etiketi eklemek ve değiştirilen kodu yüklemek için UIWebView'den soruyor, ancak yukarıda belirtilen çerçeve sorunu da burada geçerlidir.

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

Soru: UIWebView'da yüklü bir web sayfasındaki karakter kodlamasını değiştirebilen ve çerçeveleri düzgün bir şekilde işleyebilecek daha iyi bir çözüm var mı?


21
2018-02-11 19:18


Menşei


Lütfen URL'nizi buraya verin, sonra kontrol edeyim. - alok chauve
Web sayfası veya sunucu üzerinde kontrolünüz var mı? - Magnus
@magnus bu çok kolay olurdu;) - Till


Cevaplar:


HTML'yi manuel olarak yükleyerek, değiştirerek ve ardından değiştirilmiş içeriği UIWebView'e yükleyerek bunu yapabilirsiniz.

  • HTML'yi meta etiketi içermeyen sayfadan bir dizeye el ile yükleyin (ör., NSURLConnection)
  • string manipülasyonunu kullanarak, uygun kodlama meta etiketini manuel olarak yüklenen HTML'ye yerleştirin
  • Web görünümünüzdeki HTML'yi, değiştirilmiş dizeye kullanarak loadHTMLString:

Şimdi, bu hiçbir bağlantı içermeyen bir web sayfası için iyi çalışır. Bağlantılar içeriyorsa, bir bağlantıyı tıkladıktan sonra, yeni sayfanızda değişiklik yapılmayacağını göreceksiniz. Bu nedenle, tüm tıklamaları el ile ele almanız gerekir. İşte bunu nasıl yapabilirsin:


6
2017-11-22 05:38



Çerçeveler için temsilci geri bildirimini alacak mısınız? - Till
Belgelere göre evet. developer.apple.com/library/IOs/#documentation/UIKit/Reference/... - Simon Woodside
"UIWebView'a yerleştirmeden önce içeriği nasıl değiştirdiniz"? loadHTMLString, belirli bir kareye değil, her zaman kök belgeye yüklenemez. - howanghk


Bu benim işim,
önce metin olup olmadığını öğrenin, eğer varsa, veriyi alıyorum, kodlamayı ayarla ve kullanarak yükle UIWebView>loadData:MIMEType:textEncodingName:baseURL.
İşte kod:

  1. Eşzamanlı HEAD isteği gönderen MIMEType'ı edinin.
    Bir HEAD HTTP isteği kullanmak istiyoruz. genellikle yeterince hızlıdır.
    Ve talebi iki nedenden dolayı senkronize olarak yapmak istiyoruz, isteğin sonucunun devam etmesine ihtiyacımız var ve eşzamanlı istek sorunlarından kaçınmak istiyoruz bunun gibi.

     
    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. Sonra metin ise, onu yükleyin UIWebView> LoadData: MIMEType: textEncodingName: baseURL 
    Uygulamayı yanıt vermek için, aşağıdaki kodu bir bloğa koymanız ve bir GCD kuyruğu.

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

1
2017-09-04 10:53



Cevabın için teşekkür ederim. Ancak bu sadece kök belgede çalışacaktır. Iframe'ler veya çerçeve kümesi varsa işe yaramaz. Sorunu neden çözmediğiyle ilgili daha fazla ayrıntı için lütfen 4. paragrafı okuyun. - howanghk
Ayrıca, eşzamanlı istek ve - [NSString initWithContentsOfURL] kullanımı oldukça yüksek cesareti kırılmış ana iş parçacığınızı engelleyeceği gibi, ya da bunları arka plan iş parçacığına göndermeniz gerekir. Yumurtlama ipliği oldukça pahalı bir işlemdir ve bu nedenle asenkron istek daha iyi bir yaklaşımdır. - howanghk
Cevabı güncellendi. İframe'ler veya çerçeve kümeleriyle belgeler denemedim, ancak bu yaklaşım benim için yararlıydı ve bir başkası için yararlı olabilir. İkinci yoruma gelince, ana iplik veya yumurtlama ipliklerini engellemek için GCD ve blokları kullanıyorum. - user454322
encoding.spec.whatwg.org/#names-and-labels. Olası kodlama adı seçeneklerini bilmek için faydalı link. - Conor