我怎样才能从Perl输出UTF-8?

我正在尝试使用“utf8”编译指示来编写Perl脚本,并且得到了意想不到的结果。 我正在使用Mac OS X 10.5(Leopard),并使用TextMate进行编辑。 我的编辑器和操作系统的所有设置默认为以utf-8格式编写文件。

但是,当我将下面的内容input到一个文本文件中时,将它保存为“.pl”并执行它,我得到友善的“有问号的钻石”代替非ASCII字符。

#!/usr/bin/env perl -w use strict; use utf8; my $str = 'Çirçös'; print( "$str\n" ); 

任何想法我做错了什么? 我希望在输出中得到“Çirçös”,但是我得到“ ir s”。

use utf8; 不启用Unicode 输出 – 它使您能够在您的程序中键入Unicode。 在你的print()语句之前把这个添加到程序中:

 binmode(STDOUT, ":utf8"); 

看看是否有帮助。 这应该使UTF-8的STDOUT输出,而不是普通的ASCII。

您可以使用打开的杂注 。

例如。 下面设置STDOUT,STDIN和STDERR使用UTF-8 ….

 use open qw/:std :utf8/; 

TMTOWTDI ,select了最适合你工作的方法。 我使用环境方法,所以我不必考虑它。

在环境中 :

 export PERL_UNICODE=SDL 

在命令行上 :

 perl -CSDL -le 'print "\x{1815}"'; 

或用binmode :

 binmode(STDOUT, ":utf8"); #treat as if it is UTF-8 binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8 

或与PerlIO :

 open my $fh, ">:utf8", $filename or die "could not open $filename: $!\n"; open my $fh, "<:encoding(utf-8)", $filename or die "could not open $filename: $!\n"; 

或与开放的杂注 :

 use open ":encoding(utf8)"; use open IN => ":encoding(utf8)", OUT => ":utf8"; 

你也想说,你的代码中的string是utf-8。 请参阅为什么现代Perl默认情况下避免使用UTF-8? 。 所以不仅PERL_UNICODE=SDAL设置PERL_UNICODE=SDAL ,还要设置PERL5OPT=-Mutf8

谢谢,终于得到了一个解决scheme,不要把utf8 ::编码全部代码。 要合成和完成其他情况下,如写入和读取文件在utf8中,也可以使用utf8中的YAML文件的LoadFile

 use utf8; use open ':encoding(utf8)'; binmode(STDOUT, ":utf8"); open(FH, ">test.txt"); print FH "something éá"; use YAML qw(LoadFile Dump); my $PUBS = LoadFile("cache.yaml"); my $f = "2917"; my $ref = $PUBS->{$f}; print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." "; 

其中cache.yaml是:

 --- 2917: id: 2917 name: Semanário primary_uri: 2917.xml 

将输出redirect到一个文本文件,并在编辑器中尝试。 如果显示正常,那么你的terminal有问题。

在你的shell中执行:$ env | grep LANG

这可能会显示你的shell没有使用utf-8语言环境。