Se eu executar o seguinte programa Perl:
perl -e 'use utf8; print "鸡\n";'
Eu recebo este aviso:
Wide character in print at -e line 1.
Se eu executar este programa Perl:
perl -e 'print "鸡\n";'
Eu não recebo um aviso.
Achei que use utf8
era necessário usar caracteres UTF-8 em um script Perl. Por que isso não funciona e como posso corrigir? Estou usando Perl 5.16.2. Eu tenho o mesmo problema se isso estiver em um arquivo em vez de ser um liner na linha de comando.
Respostas:
Sem
use utf8
Perl interpreta sua string como uma sequência de caracteres de byte único. Existem quatro bytes em sua string, como você pode ver:$ perl -E 'say join ":", map { ord } split //, "鸡\n";' 233:184:161:10
Os primeiros três bytes constituem o seu personagem, o último é o feed de linha.
A chamada para
print
envia esses quatro caracteres para STDOUT. Seu console então descobrirá como exibir esses personagens. Se o seu console estiver configurado para usar UTF8, ele interpretará esses três bytes como seu único caractere e é isso que é exibido.Se adicionarmos o
utf8
módulo, as coisas são diferentes. Neste caso, Perl interpreta sua string como apenas dois caracteres.$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";' 40481:10
Por padrão, a camada de E / S do Perl assume que está trabalhando com caracteres de byte único. Portanto, quando você tenta imprimir um caractere multibyte, o Perl pensa que algo está errado e lhe dá um aviso. Como sempre, você pode obter mais explicações para esse erro incluindo
use diagnostics
. Ele vai dizer o seguinte:Como outros indicaram, você precisa dizer ao Perl para aceitar a saída multibyte. Há muitas maneiras de fazer isso (veja o Tutorial do Perl Unicode para alguns exemplos). Uma das maneiras mais simples é usar o
-CS
sinalizador de linha de comando - que informa os três manipuladores de arquivos padrão (STDIN, STDOUT e STDERR) para lidar com UTF8.$ perl -Mutf8 -e 'print "鸡\n";' Wide character in print at -e line 1. 鸡
vs
$ perl -Mutf8 -CS -e 'print "鸡\n";' 鸡
Unicode é uma área grande e complexa. Como você viu, muitos programas simples parecem fazer a coisa certa, mas pelos motivos errados. Quando você começa a consertar parte do programa, as coisas geralmente ficam piores até que você conserte todo o programa.
fonte
-Mutf8
se não em um perl forro?use utf8;
Tudo o que
use utf8;
faz é dizer ao Perl que o código-fonte está codificado usando UTF-8. Você precisa dizer ao Perl como codificar seu texto:use open ':std', ':encoding(UTF-8)';
fonte
Codifique todas as saídas padrão como UTF-8:
binmode STDOUT, ":utf8";
fonte
use open ':std', ':encoding(UTF-8)';
conforme proposto por outra resposta, faz isso para STDOUT, mas também marca STDERR e STDIN como UTF-8, portanto, você obtém três pelo preço de uma instrução. Consulte também stackoverflow.com/a/42194059Você pode chegar perto de "apenas fazer utf8 em qualquer lugar" usando o módulo CPAN
utf8::all
.perl -Mutf8::all -e 'print "鸡\n";'
Quando
print
recebe algo que não pode imprimir (caractere maior que 255 quando nenhuma:encoding
camada é fornecida), ele assume que você pretendia codificá-lo usando UTF-8. Ele o faz, após avisar sobre o problema.fonte
Você pode usar isso,
Isso também encerrará esse erro.
fonte
Em espanhol, você pode encontrar este erro ao lado de começar a usar:
use utf8;
A codificação do seu editor está em uma codificação diferente. Portanto, o que você vê no editor não é o que o Perl faz. Para resolver esse erro, basta alterar a codificação do editor para Unicode / UTF-8 .
fonte