/ / Como posso produzir utf-8 a partir de Perl? - perl, unicode, utf-8

Como posso produzir utf-8 a partir do Perl? - perl, unicode, utf-8

Eu estou tentando escrever um script Perl usando o"utf8" pragma, 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 em 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( "$strn" );

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

Respostas:

143 para a resposta № 1

use utf8; não habilita o Unicode saída - permite que você digite Unicode no seu programa. Adicione isto ao programa, antes do seu print() declaração:

binmode(STDOUT, ":utf8");

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


75 para resposta № 2

Você pode usar o pragma aberto.

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

use open qw/:std :utf8/;

59 para resposta № 3

TMTOWTDI, escolha o método que melhor se adapte ao seu trabalho. Eu uso o método de ambiente para que eu não tenha que pensar sobre isso.

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

1 para resposta № 4

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


0 para a resposta № 5

Obrigado, finalmente tenho uma solução para não colocar utf8 ::codifique todo o código. Para sintetizar e concluir 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

-3 para a resposta № 6

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

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