电脑工场
白蓝主题五 · 清爽阅读
首页  > 软件入门

Perl脚本乱码?一招搞定编码问题

写完一个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补上就行。