此问题在此处已有答案:
How can I output UTF-8 from Perl?(6个答案)
三个月前关门了。
我有一个问题perl输出:法语单词“préféré”有时会输出为“pr�f�r�:
示例脚本:
devel@k0:~/tmp$ cat 02.pl
#!/usr/bin/env perl
use strict;
use warnings;
print "préféré\n";
open( my $fh, '<:encoding(UTF-8)', 'text' ) ;
while ( <$fh> ) { print $_ }
close $fh;
exit;
执行:
devel@k0:~/tmp$ ./02.pl
préféré
pr�f�r�
devel@k0:~/tmp$ cat text
préféré
devel@k0:~/tmp$ file text
text: UTF-8 Unicode text
有人能帮帮我吗?
2条答案
按热度按时间ki0zmccv1#
解码你的输入,编码你的输出。你有两个错误与未能正确解码和编码有关。
具体来说,你错过了
详情如下。
Perl源代码应该是ASCII(带有8位干净的字符串文字),除非您使用
use utf8
告诉Perl它是UTF-8。我相信你有一个UTF-8终端。我们可以从
cat 02.pl
工作的事实中得出结论,你的源代码是用UTF-8编码的。这意味着Perl看到的是这样的等价物:您应该使用
use utf8;
,这样Perl就可以看到正确解码所读取的文件。
该文件可能包含
由于添加了编码层,因此您实际上是在执行
或
这是正确的。
最后,您无法对输出进行编码。
下面的代码可以满足您的需要:
但是
open
pragma使它变得更加简洁。2ledvvac2#
UTF-8是一个有趣的问题。首先,你的Perl本身会正确打印,因为你没有做任何UTF-8处理。你有一个UTF-8字符串,但Perl本身并不真正知道它是UTF-8,它也会按原样打印它。
UTF-8终端。一切看起来都很好。即使不是这样。
当你把
use utf8;
添加到你的源代码中时,你会看到,你的print
现在会产生同样的垃圾。但是如果你有包含UTF-8的字符串,那就是你应该做的。接下来,对于你从外部输入的每一个输入,你需要做一个
decode
,对于你做的每一个输出,你需要做一个encode
。这可能是乏味的。但是您可以使用
binmode
在FileHandle上启用自动编码现在所有的东西都是UTF-8!你也可以在STDERR上激活它。记住如果你想在STDOUT上打印二进制数据(无论出于什么原因),你必须禁用层。