写完一个ref="/tag/2034/" style="color:#EB6E00;font-weight:bold;">Perl脚本,本地跑得好好的,一放到服务器上就报错:Wide character in print,或者中文输出变成一堆问号、方块、甚至直接崩溃——别急,这八成是编码惹的祸。
为啥Perl老跟编码较劲?
Perl本身不强制指定源码或输入输出的字符集,它默认按字节处理。你用UTF-8写的中文变量名、中文提示、读取的中文配置文件,如果没明确告诉Perl“这是UTF-8”,它就当普通ASCII字节来啃,结果自然对不上号。
三步实操,稳住编码
第一步:声明源码编码
在脚本开头加上这行:
use utf8;这句告诉Perl:“我这个脚本文件本身是UTF-8编码保存的”,不然连中文变量名都认不出来。
第二步:声明输入输出流编码
如果你要读文件、打印中文、或和终端交互,得给标准输入输出“打个补丁”:
use open ':std', ':encoding(utf8)';这行一加,print自动转UTF-8输出,<STDIN>和open读文件也默认按UTF-8解码——省心又安全。
第三步:读写文件时显式指定编码
比如读一个含中文的配置文件:
open my $fh, '<:encoding(utf8)', 'config.txt' or die $!;
while (<$fh>) {
chomp;
print "读到:$_\n";
}写文件也一样:
open my $out, '>:encoding(utf8)', 'result.txt' or die $!;
print $out "用户:张三,操作成功\n";小技巧:一眼看出文件编码
Linux/macOS下用file -i 文件名,Windows下用Notepad++打开,右下角直接显示当前编码(比如“UTF-8-BOM”、“GBK”)。Perl脚本自己建议统一存成UTF-8无BOM格式,最省事。
遇到Can't locate encoding.pm?说明Perl没装编码模块,Ubuntu/Debian下运行sudo apt install perl-modules,CentOS用yum install perl-Encode补上就行。