이전에 포스팅한 "NSXMLParser로 RSS 읽어오기"와 유사한 방법으로 구글 날씨 RSS를 가져오는 것을 만들어 보았습니다. 그런데 한글이 깨져나와 확인해 보니 문자셋이 euc-kr이었습니다. 문자셋을 확인하는 방법은 URLConnection의 델리게이트 메소드에서 확인할 수 있습니다.
전송이 끝난 후에 아래와 같이 NSData를 euc-kr을 utf-8로 변환하여 사용할 수 있습니다. 변경된 data를 NSXMLParser의 initWithData의 인자로 사용하면 됩니다.
한가지 이상한 점은 웹브라우저에서 확인하면 같은 URL이지만 utf-8로 넘어 옵니다. 아마 서버에서 헤더를 검사에서 각각 다른 인코딩으로 넘겨주는 것이 아닌가 하는 생각이 듭니다. 헤더의 항목들을 변경해서 보았는데 User-Agent를 설정해서 보내보니 euc-kr이 아닌 utf-8로 넘어 왔습니다.
구글의 날씨 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를 사용해서 정리해 보았습니다.
보기도 조금 나아지지만 해당 클래스에 대한 애플의 문서로 바로 링크가 되는 것도 좋은 것 같습니다.
- NSLog(@"Encoding: %@", [response textEncodingName]);
- }
전송이 끝난 후에 아래와 같이 NSData를 euc-kr을 utf-8로 변환하여 사용할 수 있습니다. 변경된 data를 NSXMLParser의 initWithData의 인자로 사용하면 됩니다.
- .
- .
- .
- }
한가지 이상한 점은 웹브라우저에서 확인하면 같은 URL이지만 utf-8로 넘어 옵니다. 아마 서버에서 헤더를 검사에서 각각 다른 인코딩으로 넘겨주는 것이 아닌가 하는 생각이 듭니다. 헤더의 항목들을 변경해서 보았는데 User-Agent를 설정해서 보내보니 euc-kr이 아닌 utf-8로 넘어 왔습니다.
- 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"];
- initWithRequest:request
- 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];
[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];
보기도 조금 나아지지만 해당 클래스에 대한 애플의 문서로 바로 링크가 되는 것도 좋은 것 같습니다.
'iOS > 자잘한 팁' 카테고리의 다른 글
Storyboards are unavailable on iOS 4.3 and prior 오류 (0) | 2011.12.08 |
---|---|
소소한 팁 1 (1) | 2010.01.08 |
아이폰 흔들기(shaking) 검사 (8) | 2009.09.29 |
한글 인코딩 변경과 구글날씨 RSS (14) | 2009.09.11 |
NSURLConnection으로 웹페이지 내용 가져오기 (12) | 2009.07.03 |
UIViewController의 setEditing 메소드 (0) | 2009.06.26 |
또 잘보고갑니다 ㅎㅎ 매번 찾아봐야하는데..
웹쪽이 급해서 우선공부를 하고있는지라..
도움만 받고 갑니다 ^^
그래도 잊지 않으시고 간혹 찾아 주시니 반갑습니다.
ㅎㅎ 또 방문했습니다 ㅎㅎ
제가좀 알고있는 블로그도 많이 없고 ㅎㅎㅎ
유독 코코아데브님 블로그만 자주오게됩니다 ㅎㅎ
빨리빨리 아이폰SDK를 간파해야하는데 ㅠ_ㅠ
http://www.icarusx.com - ICARUSX 라는 php+Ajax 무료 오픈 게시판 배포일정을
잡고 매일 나홀로 철야 작업중이다 보니..
도무자 아이폰관련 공부할 시간이 나질않는군요;;
몇일있음 오픈이라.. 오픈후에 사용해줄 사람이 있을지 의문이지만..
바빠지건 말건을 떠나.. 조금이나마 더 시간을 투자해서 공부해야할듯해요
조금더 깁숙!!히 공부시작하면 귀찮게 해드릴 지도 모르겠습니다 ㅎㅎㅎ
아무튼 겨울이 성큼! 다가왔네요.. cocoadev님 감기조심하시고 플루도 조심하시구요
올겨울은 유난히.. 춥네요.. 가난해져서 그런가 -_-;; 쿨럭;;
대단한 것을 만들고 계시네요. 사용하는 사람이 적더라도 만드는 동안의 경험의 이카루스님에게 소중한 자산이 될 것 같습니다.
오늘도 무척 춥네요. 건강 조심하시고요. ^^
좋은 정보 감사 드립니다.
그런데, 예전에 올려주신 내용 (http://cocoadev.co.kr/245) 과 위의 내용을 적용해서 해 보았는데요..
didStartElement와 didEndElement는 정상적으로 호출이 되는데,
foundCharacters는 호출이 되지 않습니다.
(다른 RSS는 잘 되는데 구글의 날씨:http://www.google.com/ig/api?weather=seoul 만 안되는 것 같습니다.)
제가 뭐를 잘 못한것 아닌지 조언을 부탁 드립니다.
혹시 가능하시면, http://cocoadev.co.kr/245번 처럼 소스를 올려 주시면 더 이해가 쉬울것 같습니다.
그럼.. 우울한 날씨지만.. 주말 잘 보내시기를..^^
안녕하세요. 소스는 이부분만 따로 구현한 것이 없어 올려 드릴수가 없네요.
foundCharacters가 호출되지 않는다면 그 전에 어떤 오류가 있는 것 같습니다. 오류 발생시 호출되는 델리게이트 메소드들을 구현하셔서 확인해 보셔야 할 것 같습니다.
그럼 좋은 하루 보내세요. ^^
제가 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
관련 내용에 대해 문의 드립니다.
지역정보는 언급하신 구글 Local Search ajax로 가져 오시면 될 것 같은데요.
넹.. 감사합니다.
Local Search 쪽에서 원하는 Data를 가져 올수 있었습니다.
ajax나 주변 여러가지 개념을 잘 모르는 상태이다 보니..
한참을 헤맸던것 같습니다..
다시한번 감사드리고요..
좋은 하루 되시구요..^^
제가 도움 드린건 없는 것 같은데요. ^^; 하시는 부분 잘 되시길 바랍니다.
didStartElement에서
NSString * strData = [attributeDict objectForKey:@"data"]; 를 사용하여
Data들을 추출 하고 어떻게 부려주나요?
[[cell textLabel] settext:[dict objectForKey:@"city"]];
[[cell textLabel] settext:strData];
이렇게 뿌려주면 될까요?
말씀하신대로 해당 키값을 확인하시고 objectForKey를 이용해서 설정하시면 될 것 같습니다.
아이폰개발에 처음 접하고 나서 매우 많은 도움을 받고 있습니다. 이런 글로나마 감사를 드립니다.
그런데 위의 예제에서
NSString *str = [[NSString alloc] initWithData:receiveData encoding:0x80000000 + kCFStringEncodingDOSKorean];
라는 부분은 release 를 어디서 해주어야 하는지요?
Instrument에서는 저 부분에서 메모리 leak이 생긴다고 하는데,
일단, connectionDidFinishLoading 메소드 내에서 해주면 어플이 그냥 죽어버립니다.
잘 보고 갑니다. 퍼가요~