2012-04-16 136 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。