首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么HTML::TreeBuilder在输出中显示mojibake/奇怪的字符?

为什么HTML::TreeBuilder在输出中显示mojibake/奇怪的字符?
EN

Stack Overflow用户
提问于 2010-06-09 22:07:22
回答 1查看 588关注 0票数 0

我在使用HTML::TreeBuilder时遇到了问题;它在输出中显示了mojibake/奇怪的字符。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2010-06-10 21:18:40

你一整天都没有得到答案,因为你的代码在形状和内容上都是一团糟的,你甚至没有费心在整个程序中做一个简化的测试用例。MvanGeest还在问题所附的评论中产生了误诊。

问题是编写Breitbart的CMS的人是愚蠢的,他们插入NCR &#151; (这是一个不可打印的字符,甚至可能是一个无效的字符),而他们应该简单地插入字符 (U+2014 EM DASH);毕竟,文档编码被声明为UTF-8。(可以清楚地看到,编码应该是Windows-1252,其中分配了代码点151 (十进制)。)

您可以通过显式的解码/编码步骤来解决他们的无能问题。

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3006611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档