天天看點

[perl]Wide character in print報錯

用perl寫文本處理程式,或者寫伺服器端腳本的時候,常常會遇到“Wide character in print”的警告或者錯誤。

這是因為在程式中進行中文等寬字元時,perl不能識别要處理的内容。

首先要知道perl隻能處理兩種編碼:ascii碼和utf-8。ascii碼是很少的,像中文、日文、韓文等字元要想能被perl處理,隻能用utf-8編碼方式。字元串在perl内部的存儲格式如下圖:

[perl]Wide character in print報錯

當flag是1的時候,perl就會把那個字元串當做utf-8編碼的字元來處理;如果是0,perl就不能認知字元串中除了ascii碼之外的字元,這個時候,就會報出“Wide character in print”的警告或者錯誤。

舉個例子,你要在程式中處理‘當曆史成為曆史’這個字元串,如果你的程式檔案是utf-8編碼的話,一般情況下直接處理就行了,因為這 時字元串的utf8-flag是打開的。如果你的程式檔案是gb2312的話,那麼你就需要把那個字元串的utf8-flag打開。但是,一般還會有這樣 的問題,因為這個字元串是gb2312編碼的,是以你要做兩件事情:将字元串的編碼轉為utf-8和打開utf8-flag。

use Encode;

use strict;

my $str = "當曆史成為曆史";

Encode::_utf8_on($str);

print $str. "\n";

Encode::_utf8_off($str);

将上面的這段程式存到檔案裡,試圖運作的時候就會報錯:Wide character in print at test.pl line 6。這就是因為utf8-flag被關閉,perl不能識别字元串。

當然,在每個處理寬字元的地方加上Encode::_utf8_on函數确實是個解決辦法。但是一般來說,在每個地方都加上這樣的函數,既在編寫程式的時候麻煩,維護的時候更麻煩。

這裡還有一個更好的辦法:在程式檔案的頭部加上以下内容

use utf8;

binmode(STDIN, ':encoding(utf8)');

binmode(STDOUT, ':encoding(utf8)');

binmode(STDERR, ':encoding(utf8)');

本文轉自dongfang_09859 51CTO部落格,原文連結:http://blog.51cto.com/hellosa/658867,如需轉載請自行聯系原作者