2011-06-02 62 views
8

由於各種原因,我從舊版腳本中收到錯誤消息Malformed UTF-8 characterWide character in print如何在Perl中抑制UTF-8警告?

我想禁止/禁用這兩個警告,以便它們不寫入STDERR

我該怎麼做?

回答

6
no warnings 'utf8'; 

但最好弄清楚爲什麼你會收到警告並解決潛在的問題。這兩個警告表明您的腳本中出現了問題。抑制警告不會解決錯誤。

5

這裏有兩個例子來幫助你理解錯誤:

[email protected]: ~/Milu/Dev/Perl > cat malformed-utf8-char.pl 
use utf8; # script source must be in UTF-8 
use strict; 
use warnings; 
print "K�se\n"; 
[email protected]: ~/Milu/Dev/Perl > perl malformed-utf8-char.pl 
Malformed UTF-8 character (unexpected non-continuation byte 0x73, 
immediately after start byte 0xe4) at malformed-utf8-char.pl line 4. 
Kse 

來源是Latin-1的,我的終端是UTF-8。字符串實際上是「Käse」。必須刪除utf8編譯指示,或將源文件保存爲UTF-8。

[email protected]: ~/Milu/Dev/Perl > cat wide-char-in-print.pl 
use utf8; 
use strict; 
use warnings; 
# binmode STDOUT, ':utf8'; 
print "Группа сайтов РИА Новости\n"; 
[email protected]: ~/Milu/Dev/Perl > perl wide-char-in-print.pl 
Wide character in print at wide-char-in-print.pl line 5. 
Группа сайтов РИА Новости 

源包含西里爾字符,因此utf8編譯指示是爲了。然而,要將這些字符輸出到終端,還必須將STDOUT設置爲UTF-8,您可以通過調用binmode來實現。如果您不這樣做,則由於寬(Unicode超出0x255)字符不適合通過窄(字節)輸出通道而觸發警告。它仍然看起來是正確的,因爲Perl只會輸出字節,因此看起來正確。

+1

這是最好的答案因爲與其告訴新程序員如何關閉「煩人」警告,如果您不明白爲什麼要獲取這些警告,則不應該這樣做,它會告訴您如何防止首先獲取警告。大多數警告都會幫助您解決問題。我聽說99.999%的時間,程序員,而不是計算機/編譯器/解釋器是問題所在。關閉這個警告很容易,但要養成關閉煩惱的習慣是一個不好的說法。 – osirisgothra 2014-09-16 16:01:26

12

大概你在使用utf8。你必須打開每個文件句柄的utf8處理。

binmode STDERR, ":encoding(utf8)"; 

您可以爲所有的標準做處理與use open ":encoding(utf8)"。有關更多信息,請參閱open

最後,您可以用utf8::all utf8-ify所有內容,代碼,文件句柄和參數。

注意:utf8打開UTF8處理,但:encoding(utf8)檢查的數據是有效的UTF8,因此它是安全的。詳情請參閱perldoc -f binmode

1

曾與調試輸出從log4perl在Windows PowerShell控制檯使用Perl同樣的問題

Wide character in print at C:/strawberry/perl/site/lib/Log/Log4perl/Appender/Screen.pm line 39. 

的解決方案是(在log4perl配置文件)

log4perl.appender.Screen.utf8 = 1 
在我看來