昨天在測試一個網頁接口,頁面返回GBK類型的xml數據,對其進行xml的解析,而後打印遇到了編碼問題,隨後查了相關資料,順利解決,總結一下。html
Perl中的字符串有兩種形式,一種是字節數組,另外一種是utf-8編碼的字符串。數組
Perl如何肯定當前字符串是屬於哪種呢?在Perl的內部,一個字符串是由兩部分組成的,除了包含字符串主體數據外還有一個屬性utf8 flag,這是字符串的一個狀態屬性,根據這個狀態,Perl就會知道將字符串當成哪一種形式來處理。測試
utf8 flag爲Off時,Perl會將字符串看成字節數組來處理。ui
utf8 flag爲On時,Perl會將字符串看成utf8編碼字符串來處理。編碼
判斷一個字符串的utf8 flag的狀態能夠經過Encode::is_utf8($str)方法。spa
一個字符串的不一樣utf8 flag狀態時,對某些操做都是會受影響的,例如:.net
1 use Encode; 2 3 my $str = '你好'; 4 Encode::_utf8_on($str); 5 my $len = length($str); 6 print $len."\n"; 7 Encode::_utf8_off($str); 8 my $len = length($str); 9 print $len."\n";
備註:腳本文件編碼爲utf-8unix
執行結果:code
2xml
6
Perl字符串的編碼狀態對正則的操做也是有影響的,以下:
1 use Encode; 2 3 my $str1= 'hello-----科大訊飛'; 4 my $str2= 'hello-----科大訊飛'; 5 6 Encode::_utf8_on($str1); 7 Encode::_utf8_off($str2); 8 9 $str1=~s/\W+//g; 10 $str2=~s/\W+//g; 11 12 $str1 = encode("gbk",$str1); 13 print $str1."\n"; 14 print $str2."\n";
第12行代碼是爲了在命令提示符下顯示中文,由於該腳本文件自己爲utf-8編碼。
程序執行結果:
hello科大訊飛
hello
根據以上結果咱們能夠看出,不一樣的Perl字符串形式對正則是有影響的。
接下來簡單介紹下Perl中編碼的轉換。
若你有一字符串「你好」,編碼爲gb2312,utf8 flag爲off,咱們知道,該字符串會被看成字節數組,若這時,你強行改變utf8 flag爲on的話,那麼該字符串就會被看成utf-8字符串來處理,該字符串自己就是gb2312的,你非要讓其看成utf-8,確定會出現錯誤【亂碼異常等】,對於一個gb2312編碼的字符串如何將其轉成utf-8呢?
代碼以下:
$str = Encode::decode("gb2312", $str); $str = Encode::encode("utf8",$str);
在執行上句以前,$str的utf8 flag必定要是off的,不然會影響decode解碼。
上句代碼的意思是將$str字符串,根據gb2312編碼,轉換成Perl的內部格式,而後再從Perl的內部格式經過encode方法編碼成utf8的編碼。
執行完encode語句以後,utf8 flag的狀態會被設置成on狀態。
關於Perl編碼方面還有不少的內容,可參考:http://blog.chinaunix.net/uid-23622436-id-2394070.html