it-swarm.dev

Como posso produzir o 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.

102
Peter Conrey

use utf8; não habilita o Unicode output - ele permite que você digite Unicode no seu programa. Adicione isto ao programa, antes da sua instrução print():

binmode(STDOUT, ":utf8");

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

152
Chris Lutz

Você pode usar o open pragma .

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

use open qw/:std :utf8/;
82
draegtun

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 ambiente :

export Perl_UNICODE=SDL

no 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 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";
64
Chas. Owens

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.

1
Hans Ginzel

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
0
Sérgio