2012-04-16 232 views
2

我有一个脚本,将下载www网页,我想提取文本并将其存储在一个统一的编码(UTF8会很好)。下载(UserAgent),解析(TreeBuilder)和文本提取似乎很好,但我不知道我是否正确保存它们。Perl编码 - 将文件保存到UTF8

当打开例如notepad ++中的输出文件时,它们不会查看;原始HTML视图在文本编辑器中查找。

的HTML文件通常具有 的charset =窗口-1256或 的charset = UTF8

所以我想,如果我能得到一个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,否则。

我已经厌倦

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

但似乎没有正常工作。

在那里的任何专家知道我缺少什么?

在此先感谢!

回答

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); 
+0

貌似问题是输入编码。我假设自从perl正在读东西,如果它是UTF-8,它会正确地读取它。显然不是!此代码帮助....现在我只需要弄清楚每种文件类型的编码!当有一个content_type标签时,它很简单,但否则......?任何方式自动做到这一点? – TerpFan 2012-04-20 21:46:44

+0

@TerpFan - 我的代码允许您选择正确的输入编码,所以如果您知道该输入的编码,它应该适用于您。如果不提供编码类型,那么它应该是您的默认阅读编码。我希望我的回答能帮助你。如果是这样,请接受我的回答(点击我答复旁边的数字旁边的复选标记 - 它会将颜色更改为绿色)。谢谢你,祝你好运! – 2012-04-20 21:49:54

+0

谢谢。由于我使用HTML文件,我能够先打开并找到编码,然后重新打开它!这是关键.....我假设perl在第一个palce中正确打开文件... \t if($ fileline =〜m/charset =(\ S +)\“/){ \t \t $ charset = $ 1 ; – TerpFan 2012-04-23 03:34:15

-3

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

只需use utf8::all而且您只使用UTF-8文件工作时不需要担心IO。