通过改变PerlIO层的编码即可实现,配合encoding指示符可以使操作过程更为自然,如读取UTF-16编码的文本文件:
use encoding 'gbk'; # 系统默认编码为GBK
use open IN=>':encoding(utf16)'; # 读入文件时认为数据按UTF-16编码,自动根据BOM头判断是LE还是BE
open(FH,"test.txt") or die;
while(<FH>) { # 读入数据时自动从UTF-16转换为标准的UTF-8编码的Perl字符串
chomp;
print "$_\n"; # 由于encoding指定了系统默认编码,输出时数据自动从UTF-8转换为GBK
}
也可以用open的3参数形式指定单个文件句柄的PerlIO层编码,并在输出时手工转换编码:
use Encode; # 需要使用encode函数实现手工转码
open(FH,"<:encoding(utf16)","test.txt") or die; # 指定FH句柄的数据为UTF-16编码
while(<FH>) { # 读入数据同样自动转换为UTF-8
chomp;
print encode("gbk",$_),"\n"; # 手动将UTF-8编码字符串转换为GBK编码字符串输出
}
另外使用binmode可以随时切换某个文件句柄的PerlIO层编码,如:
binmode(FH,":encoding(utf16)"); # 将FH的数据编码置为UTF-16
binmode(FH,":raw"); # 不对FH的数据进行编解码处理
binmode(FH,":utf8"); # 将FH的数据编码置为UTF-8
- 作者: chaoslawful 2005年02月28日, 星期一 22:50 加入博采
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=839877