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];

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

AND

간혹 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..'를 클릭하시면 스크립트의 내용을 확인하실 수 있습니다.

'기타 > 자잘한 Tip' 카테고리의 다른 글

sqlite3에서 csv import/export  (0) 2009.08.26
Python에서 sqlite3 사용하기  (1) 2009.08.26
Xcode에서의 Ruby on Rails  (8) 2008.08.20
Dashcode로 올블로그 RSS 위젯 만들기  (2) 2008.05.22
자주 사용하는 MySQL 명령어  (4) 2008.02.28
AND