2011-02-11 4 views
21

요약 : iOS에서 UIWebView로 올바른 문자 인코딩을 명시 적으로 지정하지 않은 영어가 아닌 사이트를 탐색 할 때 페이지를 올바르게 표시 할 수 없습니다.UIWebView에서 문자 인코딩을 변경하는 방법은 무엇입니까?

상세 설명 :있는 UIWebView에서 loadRequest: 방법을 잘 (ISO-8859-1로 웹 서버 또는 HTML 메타 태그에 기록 된 문자 집합 및 기본에서 전송 된 문자 세트 헤더에 지정된 인코딩을 사용합니다으로, charset이 지정되지 않은 경우 영어 이외의 사이트가 제대로 표시되지 않을 수 있습니다.

Google에 UIWebView에서 사용하는 charset을 변경하는 방법을 시도했지만 인코딩 방법을 loadData:MIMEType:textEncodingName:baseURL: 방법으로 지정하면 인코딩 이름을 지정할 수 있습니다. 우리가있는 UIWebView 프레임을로드 할 때 알림을받을 수있는 방법을 발견, 심지어 경우의 UIWebView 대리자 방법 프레임 webView:shouldStartLoadWithRequest:navigationType:를 호출하지 않기 때문에

은 그러나, 대신 loadRequest:loadData:MIMEType:textEncodingName:baseURL: +있는 NSURLConnection를 사용하는 것은 좋지 않습니다 프레임 콘텐츠를로드하려면 loadData:MIMEType:textEncodingName:baseURL:으로 호출 할 수 없습니다. 그렇게하면 프레임이 외부 페이지로로드되기 때문입니다.

게다가 자바 스크립트 해킹을 시도했지만 속성이 읽기 전용이며 변경할 수없는 것으로 보입니다.

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

또 다른 해결 방법은 HTML에 메타 태그를 삽입하고 수정 된 코드를로드 할 수있는 UIWebView를 요구하지만, 위에서 언급 한 프레임 문제는 여기에 적용된다.

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

질문 :있는 UIWebView에로드 된 웹 페이지의 문자 인코딩을 변경하고 프레임을 제대로 처리 할 수있는 더 나은 솔루션이 있습니까?

+1

여기에 귀하의 URL을 제공하는 다음 날 확인 주시기 바랍니다. –

+0

웹 페이지 또는 서버를 제어 할 수 있습니까? – Magnus

+0

너무 쉽게 @magnus;) – Till

답변

6

HTML을 수동으로로드하고 수정 한 다음 수정 된 내용을 UIWebView에로드하여이 작업을 수행 할 수 있습니다.

  • 수동으로 문자열 조작을 사용하여 (예를 들어 NSURLConnection 사용)
  • 문자열로 메타 태그를 포함하지 않는 페이지에서 HTML을로드 수동으로로드 된 HTML로 적절한 인코딩 메타 태그를 삽입
  • loadHTMLString:

지금이 더 링크를 포함하지 않는 웹 페이지에 대한 잘 작동합니다 사용하여 수정 된 문자열로 웹보기에서 HTML을 설정합니다. 링크가 포함되어있는 경우 링크를 클릭하면 새 페이지가 수정되지 않습니다. 따라서 모든 클릭을 수동으로 차단해야합니다.

  • , 당신의 대리자 메서드에서 방법 webView:shouldStartLoadWithRequest:navigationType:
  • 을 구현있는 UIWebView 위임
  • 을 구현 수동으로 URL을로드하고 위의있는 UIWebView로 설정하기 전에 내용을 수정 : 여기에 당신이 그렇게 할 수있는 방법입니다.그것이 경우에, 나는 데이터를 얻을 수 인코딩을 설정하고 UIWebView>loadData:MIMEType:textEncodingName:baseURL를 사용하여로드, 텍스트의 경우
+0

프레임에 대한 대리자 콜백을 받게됩니까? – Till

+0

문서에 따르면 그렇습니다. http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIWebViewDelegate_Protocol/Reference/Reference.html –

+0

"UIWebView에 내용을 설정하기 전에 내용을 어떻게 수정 했습니까?" loadHTMLString은 특정 프레임에는로드 할 수 없지만 항상 루트 문서는로드 할 수 없습니다. – howanghk

1

이 내가 할 무엇,
먼저 알아보십시오.

  1. 는 동기 HEAD 요청을 보내는 MIME 타입을 가져 오기 :
    다음은 코드입니다.
    머리글 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]; 
    
+0

답변 해 주셔서 감사합니다. 그러나 이것은 루트 문서에서만 작동합니다. iframe 또는 프레임 세트가 있으면 작동하지 않습니다. 문제가 해결되지 않은 이유에 대한 자세한 내용은 4 번째 단락을 참조하십시오. – howanghk

+0

게다가, 동기 요청과 - [NSString initWithContentsOfURL]을 사용하면 주 스레드를 차단하거나 백그라운드 스레드에이를 디스패치해야하기 때문에 매우 __discouraged__됩니다. 산란 스레드는 꽤 비싼 연산이므로 비동기 요청이 더 나은 접근 방법입니다. – howanghk

+0

답변을 업데이트했습니다. iframe 또는 프레임 세트가있는 문서를 시도하지 않았지만이 접근법은 나에게 유용하며 다른 사람들에게 유용 할 수 있습니다. 두 번째 주석에 관해서는 GCD와 블록을 사용하여 주 스레드를 차단하거나 스레드를 생성하지 않습니다. – user454322

관련 문제