Perl編碼

昨天在測試一個網頁接口,頁面返回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

相關文章
相關標籤/搜索