用perl寫文本處理程序,或者寫服務器端腳本的時候,經常會遇到「Wide character in print」 的<p>警告或者錯誤。<p> 這是由於在程序中處理中文等寬字符時,perl不能識別要處理的內容。<p> 首先要知道perl只能處理兩種編碼:ascii碼和utf-8。ascii碼是不多的,像中文、日文、韓文等字符<p>要想能被perl處理,只能用 utf-8編碼方式。字符串在perl內部的存儲格式以下圖:<p>服務器
當flag是1的時候,perl就會把那個字符串當作utf-8編碼的字符來處理;若是是0,perl就不能認知字<p>符串中除了 ascii碼以外的字符,這個時候,就會報出「Wide character in print」的警告或者<p>錯誤。<p> 舉個例子,你要程序中處理‘當歷史成爲歷史’這個字符串,若是你的程序文件是utf-8編碼的話,<p>通常狀況下直接處理就好了,由於這 時字符串的utf8-flag是打開的。若是你的程序文件是<p>gb2312的話,那麼你就須要把那個字符串的utf8-flag打開。可是,通常還會有這樣 的問題,<p>由於這個字符串是gb2312編碼的,因此你要作兩件事情:將字符串的編碼轉爲utf-8和打開<p>utf8-flag。<p> use Encode;<p> use strict;<p> my $str = "當歷史成爲歷史";<p> Encode::_utf8_on($str);<p> print $str. "\n";<p> Encode::_utf8_off($str);<p> print $str. "\n";<p> 將上面的這段程序存到文件裏,試圖運行的時候就會報錯:Wide character in print at test.pl line <p>6。這就是由於utf8-flag被關閉,perl不能識別字符串。<p> 固然,在每一個處理寬字符的地方加上Encode::_utf8_on函數確實是個解決辦法。可是通常來講,在<p>每一個地方都加上這樣的函 數,既在編寫程序的時候麻煩,維護的時候更麻煩。<p> 這裏還有一個更好的辦法:在程序文件的頭部加上如下內容<p> use utf8;<p> binmode(STDIN, ':encoding(utf8)');<p> binmode(STDOUT, ':encoding(utf8)');<p> binmode(STDERR, ':encoding(utf8)');<p>ide