首页 文章

如何从Perl输出UTF-8?

提问于
浏览
100

我正在尝试使用“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 回答

  • 151

    您还想说,代码中的字符串是utf-8 . 见Why does modern Perl avoid UTF-8 by default? . 所以不仅设置 PERL_UNICODE=SDAL 而且设置 PERL5OPT=-Mutf8 .

  • -3

    谢谢,终于得到了一个解决方案,不要把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
    
  • 0

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

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

  • 1

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

    binmode(STDOUT, ":utf8");
    

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

  • 82

    您可以使用open pragma .

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

    use open qw/:std :utf8/;
    
  • 62

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

相关问题