Perl UTF-8输出异常求助:法语词汇读取后显示乱码
Perl输出UTF-8字符乱码问题解决
你的问题是:直接打印脚本里的法语词汇“préféré”显示正常,但读取同内容的UTF-8文件后输出变成pr�f�r�乱码。
问题原因
Perl读取文件时用:encoding(UTF-8)将文件内容解码为Perl内部的Unicode字符串,但标准输出未指定编码,导致内部Unicode字符被错误编码输出。而脚本里的字面量是直接以UTF-8字节形式输出(脚本本身为UTF-8编码),终端能正确识别,所以显示正常。
解决方案
方案1:单独设置标准输出编码
在脚本开头添加binmode语句,指定标准输出使用UTF-8编码:
#!/usr/bin/env perl use strict; use warnings; binmode STDOUT, ':encoding(UTF-8)'; # 配置标准输出为UTF-8编码 print "préféré\n"; open( my $fh, '<:encoding(UTF-8)', 'text' ) ; while ( <$fh> ) { print $_ } close $fh; exit;
方案2:全局设置默认编码
使用use open编译指令,一次性设置标准输入/输出/错误,以及后续文件操作的默认编码:
#!/usr/bin/env perl use strict; use warnings; use open qw(:std :encoding(UTF-8)); # 全局设置默认编码为UTF-8 print "préféré\n"; open( my $fh, '<', 'text' ) ; # 无需再手动指定编码 while ( <$fh> ) { print $_ } close $fh; exit;
执行修改后的脚本,读取文件输出的“préféré”就能正常显示了。
内容的提问来源于stack exchange,提问作者amir
相关产品推荐
相关产品推荐

