Como posso produzir UTF-8 a partir do Perl?

Eu estou tentando escrever um script Perl usando o pragma “utf8” e estou obtendo resultados inesperados. Estou usando o Mac OS X 10.5 (Leopard) e estou editando com o TextMate. Todas as minhas configurações para o meu editor e sistema operacional são padronizadas para gravar arquivos no formato utf-8.

No entanto, quando eu inserir o seguinte em um arquivo de texto, salvá-lo como um “.pl” e executá-lo, recebo o “diamante com um ponto de interrogação” amigável no lugar dos caracteres não-ASCII.

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

Alguma ideia do que estou fazendo errado? Espero receber ‘Çirçös’ na saída, mas recebo ‘ ir s’ no lugar.

use utf8; não ativa a saída Unicode – permite que você digite Unicode no seu programa. Adicione isto ao programa, antes de sua declaração print() :

 binmode(STDOUT, ":utf8"); 

Veja se isso ajuda. Isso deve fazer a saída STDOUT em UTF-8 em vez de ASCII comum.

Você pode usar o pragma aberto .

Por exemplo abaixo define STDOUT, STDIN & STDERR para usar UTF-8 ….

 use open qw/:std :utf8/; 

O TMTOWTDI escolheu o método que melhor se adapta ao seu trabalho. Eu uso o método do ambiente, então não preciso pensar sobre isso.

No meio ambiente :

 export PERL_UNICODE=SDL 

na linha de comando :

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

ou com binmode :

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

ou com o 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"; 

ou com o pragma aberto :

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

Você também quer dizer que as strings no seu código são utf-8. Veja Por que o Perl moderno evita o UTF-8 por padrão? . Portanto, defina não apenas PERL_UNICODE=SDAL mas também PERL5OPT=-Mutf8 .

Obrigado, finalmente tenho uma solução para não colocar código utf8 :: encode todo. Para sintetizar e completar para outros casos, como escrever e ler arquivos no utf8 e também funciona com o LoadFile de um arquivo YAML no 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}." "; 

em que cache.yaml é:

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

faça no seu shell: $ env | grep LANG

Isso provavelmente mostrará que seu shell não está usando uma localidade utf-8.