如何从Perl输出UTF-8?

104 unicode perl 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" );
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*utz 154

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

binmode(STDOUT, ":utf8");
Run Code Online (Sandbox Code Playgroud)

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

  • 其他方式: open pragma ( http://search.cpan.org/perldoc/open ), -C 开关 ( http://perldoc.perl.org/perlrun.html#-C ) (3认同)
  • utf8编译指示不允许您在UNICODE中编写源代码,它强制了解UNICODE的UTF-8(或UTF-EBCDIC)编码中的源代码,这是一个重要的区别. (3认同)

dra*_*tun 83

您可以使用open pragma.

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

use open qw/:std :utf8/;
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句...我给了你+1。我认为 binmode(STDOUT, ':utf8') 在这种情况下可能更正确。“use open”还有其他很好的用途,但我似乎找不到如何将其设置为仅对 STDOUT 进行编码? (2认同)

Cha*_*ens 64

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

环境中:

export PERL_UNICODE=SDL
Run Code Online (Sandbox Code Playgroud)

命令行上:

perl -CSDL -le 'print "\x{1815}"';
Run Code Online (Sandbox Code Playgroud)

或者使用binmode:

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

或者使用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";
Run Code Online (Sandbox Code Playgroud)

或者用开放的pragma:

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";
Run Code Online (Sandbox Code Playgroud)

  • +1表示全面的答案;请注意,“SDL”隐含在“-C”和“PERL_UNICODE”中。`use open ':locale'` 编译指示也值得一提,因为它是 `-C` 和 `export PER_UNICODE=` 的脚本内等效项。假设您的环境区域设置是基于 UTF8 的,这 3 个中的任何一个都会为您的所有输入和输出流(无论是文件还是 stdin/stdout/stderr)提供 UTF8 支持。最后,要将_source_代码也视为UTF8,请使用“use utf8;”编译指示。 (2认同)