2010-07-29 23 views
2

一個perl腳本可以從網站中刪除靜態html頁面,並將它們寫入單個文件,但似乎也可以正常工作,但也會將多個wide character in print at ./script.pl line n實例打印到控制檯:每個頁面都會被刮掉一個。如何找到perl打印的「寬字符」?

但是,簡單瀏覽一下生成的html文件並不會在刮擦中發現任何明顯的錯誤。我如何查找/修復問題字符?我是否應該關心修復它?

相關的代碼:

use WWW::Mechanize; 
my $mech = WWW::Mechanize->new; 
... 
foreach (@urls) { 
    $mech->get($_); 
    print FILE $mech->content; #MESSAGE REFERS TO THIS LINE 
... 

這是OSX用Perl 5.8.8。

回答

2

如果你想在事後修復了這些文件,那麼你可以管他們通過fix_latin這將確保他們都是UTF-8(假設輸入是ASCII的一些混合,拉丁語1, CP1252或UTF-8已經)。

將來,您可以使用$mech->response->decoded_content,無論使用何種Web服務器編碼,它都應該爲您提供UTF-8。在寫入之前,您應該輸入binmode(FILE, ':utf8'),以確保將Perl的內部字符串表示形式轉換爲嚴格的UTF-8字節輸出。

2

我假設你正在爬取圖像或類似的東西,無論如何,你可以通過添加binmode(FILE)解決這個問題;或者如果他們是網頁和UTF-8,則嘗試binmode(FILE, ':utf8')。見perldoc -f binmodeperldoc perlopentutperldoc PerlIO更多信息..

的 「:字節」, 「:CRLF」 和 「:UTF8」,和形式的任何其他指令 「:......」,是稱爲I/O層。 「打開」雜注可以用來建立默認的I/O層。看開放。

要將FILEHANDLE標記爲UTF-8,請使用「:utf8」或「:encoding(utf8)」。 「:utf8」只是將數據標記爲UTF-8而沒有進一步檢查,而「:encoding(utf8)」檢查數據實際上是否爲有效的UTF-8 。更多細節可以在PerlIO :: encoding中找到。

+0

我在這裏處理純html。我可以做任何事情來檢查我已經擁有的文件,或者是我唯一的選擇,從'binmode(FILE,「:utf8')''開始重新開始,在'open FILE etc'之後插入嗎? – 2010-07-29 17:13:26

+0

它不是您唯一的選擇,你可以在一個cmd中用'open(my $ fh,'>:utf8',...)'來完成。有很多問題可以導致這個問題,請閱讀[這篇博客文章](http:// www.ahinea.com/en/tech/perl-unicode-struggle.html)。 – 2010-07-29 18:15:52

+1

感謝您的鏈接,但該文章還只涉及如何防止此問題,而不是如何評估其嚴重性,以及如何解決它發生後,這是我的問題的重點。 – 2010-07-29 19:40:09