BLOG ARTICLE Encoding | 1 ARTICLE FOUND

  1. 2009.09.11 한글 인코딩 변경과 구글날씨 RSS (14)

이전에 포스팅한 "NSXMLParser로 RSS 읽어오기"와 유사한 방법으로 구글 날씨 RSS를 가져오는 것을 만들어 보았습니다. 그런데 한글이 깨져나와 확인해 보니 문자셋이 euc-kr이었습니다. 문자셋을 확인하는 방법은 URLConnection의 델리게이트 메소드에서 확인할 수 있습니다.
  1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  2.     NSLog(@"Encoding: %@", [response textEncodingName]);
  3. }

전송이 끝난 후에 아래와 같이 NSData를 euc-kr을 utf-8로 변환하여 사용할 수 있습니다. 변경된 data를 NSXMLParser의 initWithData의 인자로 사용하면 됩니다.
  1. - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  2.     NSString *str = [[NSString alloc] initWithData:receiveData encoding:0x80000000 + kCFStringEncodingDOSKorean];
  3.     NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
  4.    
  5.     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
  6. .
  7. .
  8. .
  9. }

한가지 이상한 점은 웹브라우저에서 확인하면 같은 URL이지만 utf-8로 넘어 옵니다. 아마 서버에서 헤더를 검사에서 각각 다른 인코딩으로 넘겨주는 것이 아닌가 하는 생각이 듭니다. 헤더의 항목들을 변경해서 보았는데 User-Agent를 설정해서 보내보니 euc-kr이 아닌 utf-8로 넘어 왔습니다.
  1.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/ig/api?weather=seoul"]];
  2.      
  3.     [request addValue:@"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2" forHTTPHeaderField:@"User-Agent"];
  4.  
  5.     xmlConnection = [[NSURLConnection alloc]
  6.                      initWithRequest:request
  7.                      delegate:self];


구글의 날씨 API에서는 이와 같이 User-Agent를 보내면 utf-8로 보내기때문에 위와같이 인코딩의 변환이 필요하지 않습니다. 아마 예측가능한 User-Agent는 utf-8로 보내고 그외에는 euc-kr로 보내는 것 같습니다. 이는 영문도 마찬가지이며 http://www.google.com/ig/api?weather=seoul와 같이 co.kr에서 com으로 변경하면 문자셋이 iso-8859-1로 넘어 옵니다. User-Agent를 추가하면 역시 utf-8로 넘어 옵니다.



이전부터 그냥 복사해서 올렸는데 오늘 보니 아래와 같이 나오는 건 너무 보기가 힘든 것 같아서, 예제코드를  Quick Highlighter를 사용해서 정리해 보았습니다.
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/ig/api?weather=seoul"]];
     
    [request addValue:@"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2" forHTTPHeaderField:@"User-Agent"];

    xmlConnection = [[NSURLConnection alloc]
                     initWithRequest:request
                     delegate:self];

보기도 조금 나아지지만 해당 클래스에 대한 애플의 문서로 바로 링크가 되는 것도 좋은 것 같습니다.

모든 댓글을 환영합니다. (욕설과 광고는 삭제합니다.)
  1. Favicon of http://icarusx.tistory.com BlogIcon ICARUSX 2009.10.29 18:46  댓글주소  수정/삭제  댓글쓰기

    또 잘보고갑니다 ㅎㅎ 매번 찾아봐야하는데..
    웹쪽이 급해서 우선공부를 하고있는지라..

    도움만 받고 갑니다 ^^

  2. Favicon of http://icarusx.tistory.com BlogIcon ICARUSX 2009.11.10 02:55  댓글주소  수정/삭제  댓글쓰기

    ㅎㅎ 또 방문했습니다 ㅎㅎ
    제가좀 알고있는 블로그도 많이 없고 ㅎㅎㅎ
    유독 코코아데브님 블로그만 자주오게됩니다 ㅎㅎ

    빨리빨리 아이폰SDK를 간파해야하는데 ㅠ_ㅠ

    http://www.icarusx.com - ICARUSX 라는 php+Ajax 무료 오픈 게시판 배포일정을
    잡고 매일 나홀로 철야 작업중이다 보니..

    도무자 아이폰관련 공부할 시간이 나질않는군요;;
    몇일있음 오픈이라.. 오픈후에 사용해줄 사람이 있을지 의문이지만..
    바빠지건 말건을 떠나.. 조금이나마 더 시간을 투자해서 공부해야할듯해요

    조금더 깁숙!!히 공부시작하면 귀찮게 해드릴 지도 모르겠습니다 ㅎㅎㅎ

    아무튼 겨울이 성큼! 다가왔네요.. cocoadev님 감기조심하시고 플루도 조심하시구요
    올겨울은 유난히.. 춥네요.. 가난해져서 그런가 -_-;; 쿨럭;;

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2009.11.16 09:47 신고  댓글주소  수정/삭제

      대단한 것을 만들고 계시네요. 사용하는 사람이 적더라도 만드는 동안의 경험의 이카루스님에게 소중한 자산이 될 것 같습니다.

      오늘도 무척 춥네요. 건강 조심하시고요. ^^

  3. Tim 2010.03.05 16:43  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사 드립니다.

    그런데, 예전에 올려주신 내용 (http://cocoadev.co.kr/245) 과 위의 내용을 적용해서 해 보았는데요..

    didStartElement와 didEndElement는 정상적으로 호출이 되는데,
    foundCharacters는 호출이 되지 않습니다.
    (다른 RSS는 잘 되는데 구글의 날씨:http://www.google.com/ig/api?weather=seoul 만 안되는 것 같습니다.)

    제가 뭐를 잘 못한것 아닌지 조언을 부탁 드립니다.
    혹시 가능하시면, http://cocoadev.co.kr/245번 처럼 소스를 올려 주시면 더 이해가 쉬울것 같습니다.

    그럼.. 우울한 날씨지만.. 주말 잘 보내시기를..^^

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2010.03.08 09:35 신고  댓글주소  수정/삭제

      안녕하세요. 소스는 이부분만 따로 구현한 것이 없어 올려 드릴수가 없네요.

      foundCharacters가 호출되지 않는다면 그 전에 어떤 오류가 있는 것 같습니다. 오류 발생시 호출되는 델리게이트 메소드들을 구현하셔서 확인해 보셔야 할 것 같습니다.

      그럼 좋은 하루 보내세요. ^^

  4. Tim 2010.03.15 17:31  댓글주소  수정/삭제  댓글쓰기

    제가 xml에 대한 이해가 부족했던것 같습니다..^^;

    didStartElement에서
    NSString * strData = [attributeDict objectForKey:@"data"]; 를 사용하여
    Data들을 추출 하였습니다.

    혹시..
    Google에서 지역 정보를 얻어오는 부분에 대해 조언을 구할 수 있을까요..?
    네이버의 http://dev.naver.com/openapi/apis/data/local 와 같은 OPENAPI가
    구글에서는 어떻게 해야 하는지 도통 모르겠습니다.

    아래 두군데를 조금 찾아 봤는데..
    제가 잘 몰라서인지, 해결책이 안보이네요..^^;
    [구글 Open API for Object-c] http://code.google.com/p/gdata-objectivec-client/
    [구글 로컬 검색] http://code.google.com/intl/ko-KR/apis/ajaxsearch/local.html

    관련 내용에 대해 문의 드립니다.

  5. Tim 2010.03.18 11:22  댓글주소  수정/삭제  댓글쓰기

    넹.. 감사합니다.

    Local Search 쪽에서 원하는 Data를 가져 올수 있었습니다.
    ajax나 주변 여러가지 개념을 잘 모르는 상태이다 보니..
    한참을 헤맸던것 같습니다..

    다시한번 감사드리고요..
    좋은 하루 되시구요..^^

  6. tudo 2010.04.15 17:17  댓글주소  수정/삭제  댓글쓰기

    didStartElement에서
    NSString * strData = [attributeDict objectForKey:@"data"]; 를 사용하여
    Data들을 추출 하고 어떻게 부려주나요?
    [[cell textLabel] settext:[dict objectForKey:@"city"]];
    [[cell textLabel] settext:strData];
    이렇게 뿌려주면 될까요?

  7. cyan 2010.11.19 13:03  댓글주소  수정/삭제  댓글쓰기

    아이폰개발에 처음 접하고 나서 매우 많은 도움을 받고 있습니다. 이런 글로나마 감사를 드립니다.

    그런데 위의 예제에서

    NSString *str = [[NSString alloc] initWithData:receiveData encoding:0x80000000 + kCFStringEncodingDOSKorean];

    라는 부분은 release 를 어디서 해주어야 하는지요?
    Instrument에서는 저 부분에서 메모리 leak이 생긴다고 하는데,
    일단, connectionDidFinishLoading 메소드 내에서 해주면 어플이 그냥 죽어버립니다.

  8. 당근구리 2011.03.02 09:55  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다. 퍼가요~