2010-06-09 6 views
0

HTML::TreeBuilder에 문제가 있습니다. 출력에 낯선 문자/이상한 문자가 표시됩니다. 코드가 모두 모양과 내용이 엉망 그리고 당신은 심지어 전체 프로그램에서 감소 된 테스트 케이스를 만들기 위해 귀찮게하지 않았기 때문에HTML :: TreeBuilder가 왜 mojibake/weird 문자를 출력에 표시합니까?

use strict; 
use WWW::Curl::Easy; 
use HTML::TreeBuilder; 
my $cookie_file ='/tmp/pcook'; 
my $curl = new WWW::Curl::Easy; 
my $response_body; 
my $charset = 'utf-8'; 
$DocOffline::charset = undef; 
$curl->setopt (CURLOPT_URL, 'http://www.breitbart.com/article.php?id=D9G7CR5O0&show_article=1'); 
$curl->setopt (CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.9 (KHTML, like Gecko) Chrome/6.0.400.0 Safari/533.9'); 
$curl->setopt (CURLOPT_HEADER, 0); 
$curl->setopt (CURLOPT_FOLLOWLOCATION, 1); 
$curl->setopt (CURLOPT_AUTOREFERER, 1); 
$curl->setopt (CURLOPT_SSL_VERIFYPEER, 0); 
$curl->setopt (CURLOPT_COOKIEFILE, $cookie_file); 
$curl->setopt (CURLOPT_COOKIEJAR, $cookie_file); 
$curl->setopt (CURLOPT_HEADERFUNCTION, \&headerCallback); 
open (my $fileb, ">", \$response_body); 
$curl->setopt(CURLOPT_WRITEDATA,$fileb); 
my $retcode = $curl->perform; 
if ($retcode == 0) { 
    my $dom_tree = HTML::TreeBuilder->new(); 
    $dom_tree->ignore_elements(qw(script style)); 
    $dom_tree->utf8_mode(1); 
    $dom_tree->parse($response_body); 
    $dom_tree->eof(); 
    print $dom_tree->as_HTML('<>&', ' ', {}); 
} 
sub headerCallback { 
my($data, $pointer) = @_; 
$data =~ m/Content-Type:\s*.*;\s*charset=(.*)/; 
if ($1) { 
    $charset = $1; 
    $charset =~ s/[^a-zA-Z0-9_\-]*//g; 
} 
return length($data); 
} 
+2

DOM 트리를 인쇄 중이지만 터미널이 UTF-8을 지원하지 않을 수 있습니다. 파일에 쓰고 페이지를 올바르게 표시하는 브라우저를 사용하여 읽으십시오. – MvanGeest

+0

브라우저로 cgi로 인쇄를 시도했지만 그 결과는 같습니다. – Vjy

답변

2

당신은 하루 종일 대답을하지 않았다. MvanGeest는 또한 질문에 첨부 된 주석에 오진을 일으켰습니다.

문제입니다 그들은 단순히 문자 (U+2014 EM DASH)를 삽입해야 할 때 Breitbart의 CMS는 우둔 쓴 사람들, 그들은 (비 인쇄 가능한 문자이며, 심지어 잘못된 문자)를 NCR &#151;를 삽입하는 것이 ; 결국 문서 인코딩은 UTF-8로 선언됩니다. (코드 포인트 151 (십진수)가 할당 된 Windows-1252로 인코딩 된 것으로 인코딩 된 것을 분명히 알 수 있습니다.)

명시 적 디코딩/인코딩 단계를 통해 해당 부분의 무능력을 해결할 수 있습니다.

use Encode qw(encode decode); 
⋮ 
my $string_representation = $dom_tree->as_HTML('<>&', ' ', {}); 
my $octets = encode('UTF-8', decode('Windows-1252', $string_representation); 
⋮ 
# send the correct Content-Type header in your CGI program before printing the HTTP body 
print $octets;