》在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是咱们一般说的字节数组. 另外一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编码: Ascii(octets)和utf8(string).php
perl内部字符串由flag标志位和数据区两部分组成,其存储结构以下:css
全部字符串相关的函数包括正则表达式、文件检测、都会受utf8 flag的影响。在默认状况下,utf8 flag标志位是off状态,当咱们在代码中使用了 use utf8 ,则表明flag标志位是on状态,在当前词法范围内都是有效的。html
Encode中的is_utf8函数能够用于检测当前flag开启状况,1表明on 0表明off;如下代码均是使用notepad++进行编码,字符编码格式选择UTF-8格式。linux
若要进行不一样编码之间的转换,可使用Encode模块中的decode函数和encode函数,这两个函数使用以下正则表达式
$octets = encode(ENCODING, STRING);
将标量字符串STRING从perl内部格式编码成ENCODING格式,而且返回字节流序列。数组
For example, to convert a string from Perl's internal format into ISO-8859-1:
$octets = encode("iso-8859-1", $string);
$string = decode(ENCODING, OCTETS);
以ENCODING编码格式从字节流中解读字符信息,并转化为perl内部格式编码。 markdown
For example, to convert ISO-8859-1 data into a string in Perl's internal format:
$string = decode("iso-8859-1", $octets);
下面展现gbk和utf8之间的相互转码,两种编码格式须要通过perl内部编码格式:less
若待编码的字符串已是perl内部编码格式(flag on +utf8编码),则能够直接进行编码或者解码,不须要按照上述的过程进行。函数
例子1:测试
use Encode;
#当前关闭
print "utf8 flag is 0ff\n" if !Encode::is_utf8($string1);
my $string1 = "你好";//是utf8格式,若不编码屏幕输出乱码
print Encode::encode("gbk",Encode::decode("utf8",$string1)),"\n";
#flag是off状态,看成字节来处理,长度为6
print "length:",length($string1),"\n";
运行结果:
例子2:
print "***********utf8 flag is on***************\n";
#此后utf8 flag 为on
use utf8;
my $string2 = "你好";
#当前on
print "utf8 flag is on\n" if Encode::is_utf8($string2);
#这里$string2至关因而内部格式了 flag is on and utf8 format
#能够直接编码,不用先解码后编码了
print Encode::encode("gbk",$string2),"\n";
#看成string来处理,长度为2
print "length:",length($string2),"\n\n\n\n";
运行结果:
咱们在使用perl中的文件测试符-e -s -f或者系统命令copy函数时,均要求这些函数的入参或者变量是gbk编码格式,不然会致使不符合预期的编码结果,举例以下:
我在目录下这个路径下建立了txt文件“E:\perl\文件夹1\log.txt”,不一样的编码格式答案是不符合预期的。
例子3:
print "**********file test and system copy attentions**************\n";
#文件测试或者调用系统copy函数等函数时 均须要使用gbk编码
my $src1 = "E:\\perl\\文件夹1\\log.txt";
my $src2 = "E:\\perl\\文件夹1\\log.txt";
#$src2字符串flag标志位是on,而且自己是utf8编码,
#所以$src2是perl内部格式,能够转为国标
my $gbk_src = Encode::encode("gbk", $src2);
print "gbk encode:$gbk_src\n";
#文件存在 则打印
if (-e $gbk_src){
print "it exists\n";
}
#文件不存在 则打印
unless (-e $src){
print "it don't exist\n";
}
运行结果:
字符串来源
为了可以正确的进行字符串编解码, 咱们首先要知道字符串原本的编码和utf8 flag开关状况, 这里咱们讨论几种状况.
字符转码API
#接口API
sub convert_utf8_to_gbk{
my ($utf8) = @_;
my $gbk = "";
if (Encode::is_utf8($utf8)){
$gbk = Encode::encode('gbk',$utf8);
}
else{
$gbk = Encode::encode('gbk',Encode::decode('utf8',$utf8));
}
return $gbk;
}
sub convert_gbk_to_utf8{
my ($gbk) = @_;
my $utf8 = "";
$utf8 = Encode::decode('gbk',$gbk);
return $utf8;
}
#测试用例
print convert_utf8_to_gbk("你好 中国!!\n"),"\n";
print "input:";
chomp( my $input = <STDIN>);
print "output:",convert_utf8_to_gbk(convert_gbk_to_utf8($input)),"\n";
运行结果:
参考入下资料:
http://blog.csdn.net/c_base_jin/article/details/78768591