이글은 devcel님께서 올리신 글입니다.
다시 보니까 웹뷰 릴리즈를 안했네요, 가져다 쓰시는 파일하고는 상관없어서 그냥 둘게요~~
웹뷰에서 txt파일 직접 링크를 선택해서, 바로 웹뷰상에서 txt파일이 표시될때
한글이 정상적으로 표시되지 않는 문제입니다.
이곳에 질문하셔서 좀 더 찾아봤는데, 관련된 내용이 없네요...
암튼 만들어 올립니다.
![WebControl1.png](https://www.hooni.net/xe/files/attach/images/37163/214/037/715d042e47c98ad9a6f376e357a6d9ce.png)
이렇게 표시되는걸, 정상적으로 변경합니다.
![WebControl2.png](https://www.hooni.net/xe/files/attach/images/37163/214/037/f8f65cc71ca4f444d160e7447e29c7b6.png)
요즘 txt파일 인코딩이 아마도 두가지로 사용되고 있을거에요.
맥에서 작성한 txt파일과, 윈도우즈에서 작성한 txt파일두가지가 있는데,
맥에서 작성한 파일은 제대로 표시되는것도 있고 아닌것도 있고 합니다.
윈도우즈에서 작성한 txt파일은 100% 깨져서 나오구요.
웹뷰의 shouldStartLoadWithRequest 에서 request를 가로채야합니다.
확인해서 txt파일로 넘어가고 있으면,
웹뷰와 별도로 해당 데이터를 전부 받아온뒤에
txt파일 인코딩을 재치에 맞춰서(윈도우,맥) 한번 변경한뒤에,
utf8로 다시 변경하고, 윈도우 개행문자 인식하게 <pre style ..> 지정해서 html로 감싼뒤에
웹뷰에 다시 뿌려줍니다. html style 지정하지 않으면 공백이 전부 무시되니 변경하지 않으시는게 좋습니다.
결과는 정상적으로 표시되네요^^
프로젝트파일은 이것 받으시면 됩니다.
DVTextEncoding.h / DVTextEncoding.m 두개만 프로젝트로 복사하고 사용하시면 됩니다...
사용하는 웹뷰의
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
델리게이트에서
NSString *requestURL = [NSString stringWithFormat:@"%@",[request URL]];
으로 현재 이동할려고 하는곳의 url을 잡을수 있습니다.
그리고 확인해서 txt파일로 이동하면
DVTextEncoding *dvEncoding = [[[DVTextEncoding alloc] init] autorelease];
dvEncoding.delegate = self;
[dvEncoding koreanWebText:requestURL webview:webView];
대충 이런식으로 넘겨주세요.
koreanWebText 에는, 위에서 검사할때 만든 txt파일이 있는 주소를 넘기시면 됩니다.
두번째 webView는 현재 리퀘스트한 웹뷰를 그대로 넘겨주세요.
인코딩이 끝나고 해당 웹뷰에 다시 표시합니다.
DVTextEncoding의 델리게이트를 받으셔야 합니다.
- (void)didEndEncoding:(UIWebView *)saveWeb dec:(NSData *)ed2;
- (void)didFailedEncoding;
위의 두가지 델리게이트를 날려주고, 두개 모두 필수입니다.
- (void)didFailedEncoding 의 경우는 정상적으로 가져오지 못할때니, 적당히 다른페이지로 넘기시거나 깨진채로 보여주면 됩니다
급조하다 보니... 예외처리는 알아서들 해주세요 ) ;;
정상적으로 변환이 되면
- (void)didEndEncoding:(UIWebView *)saveWeb dec:(NSData *)ed2;
가 호출됩니다.
saveWeb은 위에서 호출할때 넘겨줬던 웹뷰의 인스턴스를 그대로 다시 돌려줍니다.
해당 웹뷰에 다시 뿌려주면 자연스럽게 넘어가겠지요
시간이 좀 걸리면, 깨진 글자가 화면에 미리 나오고, 변환된 글자로 알아서 다시 표시됩니다.
사용은 :
- (void)didEndEncoding:(UIWebView *)saveWeb dec:(NSData *)ed2{
[saveWeb loadData:ed2
MIMEType:@"text/html"
textEncodingName:@"UTF-8"
baseURL:nil];
}
넘어오는 데이터가 UTF8로 인코딩된 NSData 에요. 문자열 아닙니다~
MIMEType은 text로 궂이 안하셔도 상관없구요.
암튼 즐거운 프로그래밍들 되셔요~ ^^
마음대로 쓰셔도 좋지만.. 포함 된 상단 주석은 절대로 삭제하지 말아주세요.
![WebControl3.png](https://www.hooni.net/xe/files/attach/images/37163/214/037/73319ded4bc7d7ec35b128e8cb668a19.png)