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 № 1use 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.