블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.11.12 16:01

[ Perl ] Unicode 실체참조코드 문제 - HTML Entity 인코딩관련


  흠.. 적절한 네이밍 센스를 발휘를 못하겠군요.
  가끔 웹 페이지에서 뭘 긁어와서 슥샥처리할 때 가끔 당혹스러운 사건을 당하고는 합니다.
  대표적인 게, Encode 관련해서 2바이트 문자가 와장창 깨져버리는 참혹한 현실이고, 근래 몇 번 겪었던 HTML Entity 인코딩으로 해당 텍스트 전체가 깨져버리는 건데요.
  Encode 는 Perl 로 2바이트 문자를 취급할 때 쯤 되면, 간단한 법칙만 알고 있으면 쉽게 해결할 수 있는 문제죠. 후자의 경우에는 어케저케 Google 선생님을 통해서 해결은 가능합니다. 근데 어떤 키워드로 검색하느냐가 문제겠죠.

  그래서 오늘 좀 뜨끔한 부분이라서 메모용으로 블로깅합니다.

  대상은 펄매니아의 RSS 파일입니다.
  - http://www.perlmania.or.kr/rss/perlmania.xml

  
  브라우저에서는 이렇게 제대로 나옵니다. 뭐가 문제냐 이거죠.
  그래서 Perl 코드를 써서 문제가 되는 title 만 찍어봤습니다.
use strict;
use warnings;
use XML::FeedPP;
my $feed = XML::FeedPP->new('http://www.perlmania.or.kr/rss/perlmania.xml');


foreach my $entry ($feed->get_item()) {
   print $entry->title."\n";
}

  사실 위의 브라우저 화면에서 뭐가 문제인지는 말해주고 있습니다.

  - PERLMANIA IS NOW SUFFERING FROM THE ENCODING CHANGE OF XML::RSS!! 

 라고 말이죠.
 즉 저 RSS 를 만들어내기 위해 사용한 XML::RSS 라는 모듈 자체에서 제대로 인코딩을 변경하지 못해서 발생한 문제입니다.

  이걸 원래부터가 글러먹었는데, 그걸 어떻게 처리하느냐 라고 맘편하게 생각하면 별 문제없습니다. 저도 그럴려고 했다가, 엘리트 Perl 프로그래머이신 song@#perl-kr 님께 물어보니 딱 하고 바로 답이 나왔습니다.

  HTML::Entities 로 decode 하면 끝!

  이라고 말이죠.
  그래서...
use strict;
use warnings;
use XML::FeedPP;
use HTML::Entities; # +
binmode(STDOUT, ':utf8'); # +
my $feed = XML::FeedPP->new('http://www.perlmania.or.kr/rss/perlmania.xml');
foreach my $entry ($feed->get_item()) {
   print decode_entities($entry->title)."\n"; # *
}  
 오오~ 과연! 결과는 이렇게 제대로 나오더라는 것이죠. 
 사실 몇몇 XML 관련 모듈에서 이런 경우를 당한 적이 여러번 있었습니다만.. 그때는 어떻게 넘어갔는 지 모르겠군요; 아무튼 이와 관련된 처리를 Google 에서 검색하면.. (song 님께서 대신 해주셔서...)

 
  일본의 Perl Mongers 들의 여러가지 해결방안을 볼 수 있습니다. 스펙을 알고 있다면야, 금방 답이 나오는 것이겠죠?

  아무튼 덩달아서 XML::FeedPP 를 통해서 XML/RSS 를 손쉽게 주물럭 거릴 수 있습니다. 

 요즘 Perl 을 쭈욱 만질 일이 뜸해진 터라... 이것저것 헤매는 일이 많아지고 있습니다. (PHP 에서 my 를 항상 쓰고 있다던가, PHP 하다가 Perl 에 와서는 my 를 계속 빼먹는 다던가...)

  아아.. 다언어주의... 꿈같은 이야기군요...
신고
TOTAL 467,006 TODAY 59

티스토리 툴바