BLOG ARTICLE EUC-KR | 2 ARTICLE FOUND

  1. 2009.09.11 한글 인코딩 변경과 구글날씨 RSS (14)
  2. 2008.08.25 텍스트파일 문자셋 변환 스크립트 (6)

이전에 포스팅한 "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  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다. 퍼가요~



간혹 euc-kr로된 파일들을 utf-8로 변경할 경우가 있어 파이썬으로 아래와 같이 iconv를 이용하는 간단한 스크립트를 만들어 사용했습니다.

#!/usr/bin/python

import os, sys

for arg in sys.argv[1:]:
    if os.path.isfile(arg):
        os.rename(arg, arg + '.chg')
        command = 'iconv -f euc-kr  -t utf-8 ' + arg + '.chg' + ' > ' + arg
        os.system(command)

파이썬 인자관리의 편리한 기능으로 위와 같이 단순한 코드로도 '*.txt'나 '*'와 같은 와일드카드도 자동으로 처리되어 별다른 불편함 없었습니다.

그런데 이번에는 반대로 utf-8을 euc-kr로 변경할 경우가 생겨 스크립트를 변경하면서 옵션을 추가하여 보았습니다. 몇 번 사용해 보았는데 별 문제가 없어 올려 봅니다. (오류나 잘못된 부분이 있으면 알려주시면 감사하겠습니다. ^^;;) 기본 사용법은 아래와 같습니다.

사용자 삽입 이미지

1) 옵션
  • -h: 위와 같은 사용법을 출력합니다.
  • -r: 서브디렉토리의 파일들도 변환합니다.
  • -f: 디렉토리가 아닌 인자로 넘어 온 파일들을 변경합니다.
  • -x: 이전 파일의 백업파일을 남기지 않습니다.
  • -d: 작업 디렉토리를 지정합니다.
  • -s: 이전 파일을 백업할 파일 확장자를 지정합니다.
  • -e: 변경할 파일의 확장자를 지정합니다.
  • -o: 변경될 파일의 현재 문자셋을 지정합니다.
  • -n: 변경될 문자셋을 지정합니다.

-f는 파일 단위로 -d는 디렉토리 단위로 변환하며, 두 옵션을 같이 사용할 수 없습니다. 현재 파일의 문자셋은 euc-kr로 변경될 문자셋은 utf-8이 기본으로 설정되어 있습니다. -d 옵션에선 사고(?)를 방지하기 위해 변경될 파일의 확장자가 'txt'가 기본으로 설정되어 있으며, 이는 -e[확장자] 옵션으로 변경할 수 있습니다.

이전 파일은 [파일명].chg로 동일 디렉토리에 저장되며, 이 확장자는 -s[확장자] 옵션으로 변경할 수 있습니다. -x 옵션을 사용하면 이전 파일을 저장하지 않습니다.

2) 사용예
* 현재 디렉토리의 data.txt 파일 변경 (euc-kr -> utf-8)
$ chgchar -f data.txt

* 현재 디렉토리의 data.txt 파일 변경 (utf-8 -> euc-kr)
$ chgchar -outf-8 -neuc-kr -f data.txt

* 현재 디렉토리의 *.txt 파일 변경
$ chgchar -f *.txt

* test 디렉토리 내의 모든 txt 파일 확장자를 가진 모든 파일 변경
$ chgchar -d./test -etxt

* 현재 디렉토리 내의 모든 파일과 서브 디렉토리의 파일도 변경
$ chgchar -r -e* -d./

3) 주의사항
파일을 변경하는 위험한(?) 작업인데 테스트와 사용횟수가 부족하기 때문에, 아래의 사항에 유의하시면서 사용하셔야 합니다.
  • 백업파일을 저장하지 않는 '-x' 옵션 사용하지 않는 것이 좋습니다.
  • 와일드카드(*)는 가능한 사용하지 않는 것이 좋습니다.
  • 대상 디렉토리와 파일을 확인하고 실행해 주세요.

4) 다운로드
아래의 압축파일을 다운로드 받아서 압축을 푸시고 'chmod +x ./chgchar'로 파일의 실행권한을 추가하시고 사용하시면 됩니다.

* 2008.10.21 추가
"nakada님으로 부터 파일 접근권한을 설정하지 않은 문제가 있는 것을 알게되었습니다. 자세한 내용은 nakada님의 포스팅을 참조하시기 바랍니다. nakada님이 작업하신 내용은 이곳에서도 변경해 놓았습니다. nakada님께 감사 드립니다. ^^"



* 아래의 'more..'를 클릭하시면 스크립트의 내용을 확인하실 수 있습니다.

모든 댓글을 환영합니다. (욕설과 광고는 삭제합니다.)
  1. Favicon of http://seapy.com BlogIcon nakada 2008.10.06 14:36  댓글주소  수정/삭제  댓글쓰기

    필요한일이 있어서 찾고 있었는데 감사합니다 ^^
    그런데 os.system 의 리턴값이 0이면 변환이 성공적으로 된게 아닌가요?
    os.system 메뉴얼 보면 시스템 마다 다르다고 하던데 저는 리눅스 서버에서 하는데
    iconv 중에 오류가 발생하면 256이 리턴값이고 그렇지 않으면 0이 리턴값이네요
    제가 잘못 사용하는건지 모르겠지만 success 와 fail 을 print 하는게 뒤바뀐게 아닌가 싶어서요. 백업파일은 성공했을때도 지워주고, 실패했을때는 남겨두어야 맞는거 같아서요
    잘 사용했습니다 ^^

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2008.10.06 15:34 신고  댓글주소  수정/삭제

      저도 그렇게 알고 "if ret <> 0:" 반환값이 0이 아니면 fail을 출력하도록 했는데요. 잘 못된 부분이 있나요? 타성에 젖어서 그런지 눈에 잘 안들어 오네요. ^^;;

  2. Favicon of http://seapy.com BlogIcon nakada 2008.10.06 15:57  댓글주소  수정/삭제  댓글쓰기

    우와 댓글을 바로주시네요 ^^ 저는 블로그 댓글 엄청 늦게 확인하는데요
    저는 압축파일을 받았거든요 본문에 펼쳐지는 소스로는 제대로 되있는데요
    압축파일을 풀어서 확인해본 파일은 반대로 되있었네요 ^^

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2008.10.06 16:23 신고  댓글주소  수정/삭제

      앗, 그렇군요. 수정해서 다시 올렸습니다. 알려 주셔서 감사합니다. :)

      블로그 댓글을 모니터링 하는 툴이 있어 실시간으로 알 수 있는데, 업무시간엔 확인만 하고 대부분 답변을 뒤로 미룹니다. 오늘은 좀 한가하네요. ^^;;

  3. Favicon of http://seapy.com BlogIcon nakada 2008.10.21 10:55 신고  댓글주소  수정/삭제  댓글쓰기

    퍼미션 관련해서 제가 조금 수정해본걸 트랙백 걸었습니다 ^^
    앞으로 자주 사용할것 같아요~