【问题标题】:Perl Encoding - Saving File to UTF8Perl 编码 - 将文件保存为 UTF8
【发布时间】:2012-04-27 18:30:51
【问题描述】:

我有一个将下载 www 页面的脚本,我想提取文本并将其存储在统一编码中(UTF8 就可以了)。下载(UserAgent)、解析(TreeBuilder)和文本提取看起来不错,但我不确定我是否正确保存它们。

在例如记事本++中打开输出文件时,他们不查看;原始 HTML 视图可在文本编辑器中找到。

HTML 文件通常包含 字符集=windows-1256 或 charset=UTF-8

所以我想如果我可以让 UTF8 工作,那么这只是一个重新编码的问题。这是我尝试过的一些方法,假设我有一个 HTML 文件保存到磁盘。

my $tree = HTML::TreeBuilder->new;
$tree->parse_file("$inhtml");
$tree->dump;

为 STDOUT 捕获的转储输出仅在 .txt 文件中正确显示 在文本编辑器中将编码切换为 utf8...

$formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 50);
if (utf8::is_utf8($formatter->format($tree))) {
    print "   Is UTF8\n";
}
else {
    print "   Not UTF8\n";
}

结果当内容表明是 UTF8 时显示这是 UTF8,否则显示不是 UTF8。

我累了

opening an file with ">" and ">:utf8"
binmode(MYFILE, ":utf8");
encode("utf8", $string); (where string is the output of formatter->format(tree))

但似乎没有任何工作正常。

有没有专家知道我错过了什么?

提前致谢!

【问题讨论】:

    标签: html perl encoding utf-8 character-encoding


    【解决方案1】:

    我真的很喜欢 utf8::all 模块(不幸的是不在核心中)。

    只需use utf8::all,当您只处理 UTF-8 文件时,您就不必担心 IO。

    【讨论】:

      【解决方案2】:

      这个例子可以帮助你找到你需要的东西:

      use strict;
      use warnings;
      use feature qw(say);
      use HTML::TreeBuilder qw( );
      use Object::Destroyer qw( );
      
      open(my $fh_in,  "<:encoding(cp1252)", $ARGV[0]) or die $!;
      open(my $fh_out, ">:encoding(UTF-8)",  $ARGV[1]) or die $!;
      
      my $tree = Object::Destroyer->new(HTML::TreeBuilder->new(), 'delete');
      $tree->parse_file($fh_in);
      
      my $h1Element = $tree->look_down("_tag", "h1");
      my $h1TrimmedText = $h1Element->as_trimmed_text();
      say($fh_out $h1TrimmedText);
      

      【讨论】:

      • 看起来问题是输入编码。我假设由于 perl 正在读取某些内容,如果它是 UTF-8,它会正确读取它。显然不是!这段代码有帮助....现在我只需要弄清楚每种文件类型的编码!当有一个 content_type 标签时,它是微不足道的,但除此之外......?有什么方法可以自动做到这一点?
      • @TerpFan - 我的代码允许您选择正确的输入编码,因此如果您知道该输入的编码,它应该对您有用。如果没有提供编码类型,那么它应该是您的默认阅读编码。希望我的回答对你有所帮助。如果是这样,请接受我的回答(点击我的回答左边的数字下方的复选标记 - 它会将颜色变为绿色)。谢谢你,祝你好运!
      • 谢谢。由于我使用 HTML 文件,我能够先打开并找到编码,然后正确地重新打开它!那是关键.....我假设 perl 在第一个地方正确打开了文件... if ($fileline =~ m/charset=(\S+)\"/ ) { $charset = $1;
      • @TerpFan:当您使用 HTTP 下载文件时,您应该先查看Content-Type 标头中的charset,然后再查看&lt;meta&gt; 标签。
      猜你喜欢
      • 2012-10-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多