如何从Perl输出UTF-8?
我正在尝试使用如何从Perl输出UTF-8?,perl,unicode,utf-8,Perl,Unicode,Utf 8,我正在尝试使用utf8pragma编写一个Perl脚本,结果出乎意料。我正在使用MacOSX10.5(Leopard),我正在使用TextMate进行编辑。我的编辑器和操作系统的所有设置都默认为以utf-8格式写入文件 但是,当我将以下内容输入到文本文件中,将其保存为“.pl”并执行它时,我会得到友好的“带问号的菱形”来代替非ASCII字符 #!/usr/bin/env perl -w use strict; use utf8; my $str = 'Çirçös'; print( &quo
utf8
pragma编写一个Perl脚本,结果出乎意料。我正在使用MacOSX10.5(Leopard),我正在使用TextMate进行编辑。我的编辑器和操作系统的所有设置都默认为以utf-8格式写入文件
但是,当我将以下内容输入到文本文件中,将其保存为“.pl”并执行它时,我会得到友好的“带问号的菱形”来代替非ASCII字符
#!/usr/bin/env perl -w
use strict;
use utf8;
my $str = 'Çirçös';
print( "$str\n" );
知道我做错了什么吗?我希望在输出中得到'chirçös',但我得到'�红外光谱��s。
使用utf8代码>不启用Unicode输出-它允许您在程序中键入Unicode。在您的print()
语句之前,将其添加到程序中:
binmode(STDOUT, ":utf8");
看看这是否有帮助。这将使标准输出以UTF-8格式而不是普通ASCII格式输出。在shell中执行以下操作:
$env| grep LANG
这可能表明您的shell没有使用utf-8语言环境。您可以使用
例如,以下设置标准输出、标准输入和标准输出以使用UTF-8
use open qw/:std :utf8/;
,选择最适合您工作方式的方法。我使用环境方法,所以我不必考虑它
在:
关于:
或与:
或与:
谢谢,终于找到了一个解决方案,不把utf8::编码全部代码。
在其他情况下,如utf8中的写入和读取文件,以及utf8中YAML文件的加载文件,都可以进行合成和完成
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
您还想说,代码中的字符串是utf-8。看见因此,不仅要设置PERL\u UNICODE=SDAL
,还要设置PERL5OPT=-Mutf8
,也许这不是程序。。我想这是你的shell或者你的编辑器,它可以正确地回答你的问题,如何将它显式地设置为UTF8。我认为您应该根据终端的区域设置进行调整,如中所示。终端可能未设置为UTF8,然后在UTF8中写入标准输出的数据将被错误编码!如何使用utf8
:我不知道这一点(我只是将utf8放入数据库,从未打印过)+不客气。另请参见另一个正确答案:记住,TMTOWTDI。和@Paul-如果您正在将UTF-8写入文件,您可能应该在该文件句柄上使用binmode(),并使其成为“正确”的UTF-8,但如果它起作用..其他方法:open pragma(),-C switch()FWIW原因如下:字符串只包含拉丁文1(ISO-8859-1)字符,尽管或多或少存储在utf8中,默认情况下,将输出为latin1。这样,即使使用支持unicode的perl,前unicode时代的脚本仍然可以工作。utf8 pragma不允许您使用unicode编写源代码,它强制您使用unicode的UTF-8(或UTF-EBCDIC)编码来理解源代码,这是一个重要的区别。实际上,它被设置为UTF-8。问题是我没有将binmode设置为utf-8就输出到标准输出;这将是一个正交问题。您需要您的Perl脚本输出正确的数据,然后才能担心终端仿真器如何解释它。。。我给了你+1。我认为binmode(STDOUT,“:utf8”)在这种情况下可能更正确。“UseOpen”还有其他很好的用途,但我似乎找不到如何将其设置为仅编码标准输出?+1作为一个全面的答案;请注意,SDL
与-C
和PERL\u-UNICODE
一起隐含。use open':locale'
pragma也值得一提,因为它在脚本中相当于-C
和export PER_UNICODE=
。假设您的环境的区域设置是基于UTF8的,那么这三个选项中的任何一个都将为所有输入和输出流(无论是文件还是stdin/stdout/stderr)提供UTF8支持。最后,要将源代码也视为UTF8,请使用useUTF8
pragma.perl-Mutf8-CSDL-e'…
允许使用/输出UTF-8,以及在-e
中使用UTF-8文本,例如,对于穷人的案例文件夹:perl-Mutf8-CASDL-pe若你们们从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从到到到到到到到到到到到到到到从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从Ü/'
binmode(STDOUT, ":utf8"); #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8
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";
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}." ";
---
2917:
id: 2917
name: Semanário
primary_uri: 2917.xml