如何从Perl输出UTF-8?

时间:2009-03-09 19:30:50

标签: perl unicode utf-8

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

但是,当我在文本文件中输入以下内容时,将其保存为“.pl”并执行它,我得到友好的“带问号的菱形”代替非ASCII字符。

#!/usr/bin/env perl -w

use strict;
use utf8;

my $str = 'Çirçös';
print( "$str\n" );

知道我做错了什么吗?我希望在输出中得到“Çirçös”,但我得到' ir s'。

6 个答案:

答案 0 :(得分:152)

use utf8;不启用Unicode 输出 - 它允许您在程序中键入Unicode。在print()声明之前将其添加到程序中:

binmode(STDOUT, ":utf8");

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

答案 1 :(得分:82)

您可以使用open pragma

例如。以下设置STDOUT,STDIN& STDERR使用UTF-8 ....

use open qw/:std :utf8/;

答案 2 :(得分:64)

TMTOWTDI,选择最适合您工作方式的方法。我使用环境方法,所以我不必考虑它。

environment

export PERL_UNICODE=SDL
command line上的

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";

或使用open pragma

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

答案 3 :(得分:1)

您还想说,代码中的字符串是utf-8。见Why does modern Perl avoid UTF-8 by default?。因此,不仅要设置PERL_UNICODE=SDAL,还要设置PERL5OPT=-Mutf8

答案 4 :(得分:0)

谢谢,终于得到了一个解决方案,不要把utf8 :: encode全部放在代码上。 要合成并完成其他情况,例如在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

答案 5 :(得分:-3)

在你的shell中做: $ env | grep LANG

这可能表明你的shell没有使用utf-8语言环境。