2012-11-04 9 views
2

다음 코드와 함께 'LWP :: UserAgent '를 사용하여 인코딩 된 웹 사이트'ISO-8859-1 '을 검색하고 있습니다.LWP :: UserAgent를 사용하여 ISO-8859-1로 인코딩 된 웹 사이트를 검색하는 올바른 방법은 무엇입니까?

특수 문자가 올바르게 표시되지 않아서 특히 "€"기호가 잘못 표시되는 것이 문제입니다.

콘텐츠 인코딩이 'ISO-8859-1'로 인식됩니다.

검색된 텍스트를 표시하려면 파일에 저장하고 Notepag ++로 엽니 다.

질문 : 올바른 방법으로 'ISO-8859-1 '로 인코딩 된 특수 문자를 검색하려면 어떻게해야합니까?

 

#SENDING REQUEST 
my $ua = LWP::UserAgent->new(); 
$ua->agent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1'); # pretend we are very capable browser 

my $req = HTTP::Request->new(GET => $url); 

#add some header fields 
$req->header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'); 
$req->header('Accept-Language', 'en;q=0.5'); 
$req->header('Connection', 'keep-alive'); 
$req->header('Host', 'www.url.com'); 

#SEND 
my $response = $ua->request($req); 

#decode trial1 
print $response->content_charset(); # gives ISO-8859-1 which is right 
my $content = $response->decoded_content(); #special chars are displayed wrong 

#decode trial2 
my $decContent = decode('ISO-8859-1', $response->content()); 
my $utf8Content = encode('utf-8', $decContent); #special char € is displayed as  

#decode trial3 
Encode::from_to($content, 'iso-8859-1', 'utf8'); #special char € is displayed as  too 


#example on writing data to file 
open(MYOUTFILE, ">>D:\\encodingperl.html"); #open for write, overwrite 
print MYOUTFILE "$utf8Content"; #write text 
close(MYOUTFILE); 

 
+1

당신은 출력 핸들을 binmoding으로 UTF8로 출력 인코딩을 설정하는 것을 잊었다 사용합니다. – tchrist

답변

4

는 :

말했다
my $content = $response->decoded_content(); 

iso-8859-1 캐릭터 세트는 유로 기호가 포함되어 있지 않습니다. 아마도 실제로는 cp1252 일 것입니다. 다음과 같이 수정할 수 있습니다.

my $content = $response->decoded_content(charset => 'cp1252'); 

두 번째 문제는 출력을 인코딩하지 않는다는 것입니다. 이것이 당신이하는 방법입니다.

open(my $MYOUTFILE, '>>:encoding(cp1252)', 'D:\\encodingperl.html') 
    or die $!; 
print $MYOUTFILE $content; 

은 당신이 원하는 cp1252하지의 경우 (예를 들어, UTF-8)에 적합한의 인코딩을 사용합니다. 원래 인코딩에서 원본 파일을 원하는 경우에,

my $content = $response->decoded_content(charset => 'none'); 

open(my $MYOUTFILE, '>>', 'D:\\encodingperl.html') 
    or die $!; 
binmode($MYOUTFILE); 
print $MYOUTFILE $content; 
+1

나는'decoded_content'에'charset' 매개 변수가 있다는 것을 몰랐습니다. 나는'content'와 매뉴얼'Encode :: decode'를 사용하여 제안 할 예정이었습니다. 어쨌든 이것은 정답입니다. 인코딩은 * cp1252가 아닌 ISO-8859-15가 될 수 있습니다. – hobbs

+1

@hobbs, 어떻게 보이지 않습니다. iso-8859-15의 "€"는 "A4"입니다. Iso-8859-1이라고 말하면 브라우저는 '¤'로 'A4'를 표시합니다. iso-8859-1이라고했을 때 브라우저가 "€"를 표시하는 유일한 방법은 '80', cp1252의 "€"가 발생한 경우입니다. cp1252는 iso-8859-1의 상위 집합 임에 유의하십시오. – ikegami

+1

@hobbs, 절대 '콘텐츠'를 사용하지 마세요. 그것은 약간의 gzipping을 제거하지 않습니다. 수동으로 해독하고 싶다면'my $ content = decode (..., $ response-> decoded_content (charset => 'none'));'을 사용하십시오. – ikegami

0

ISO-8859-1에는 유로화가 없습니다. 유로화 기호가 필요한 경우 ISO-8859-15 또는 더 나은 UTF-8을 사용해야합니다. 다른 동일

+0

Thnx하지만 내 웹 사이트가 아니므로 ISO-8859-1 인코딩을 변경할 수 없습니다. 어떻게 든 브라우저는 ISO-8859-1에 없더라도 € 표시합니다. € 기호를 유지하는 UTF8로 전체 문자열을 변환하는 방법이 있습니까? – Skip

+0

브라우저는 128 위치에 ISO-8859-1이있는 유로화 기호를 표시합니다. 이는 편리하지만 기술적으로 잘못되었습니다. ISO-8859-1을 ISO-8859-15로 다시 코딩하는 것이 모든 유로 기호 문자 128을 164 (ISO-8859-15의 유로 기호)로 바꾸고이를 UTF-8로 다시 코딩하는 것이 효과적 일 수 있습니다. –