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:
(S utf8) Perl encontrou um caractere largo (> 255) quando não estava esperando um. Este aviso é ativado por padrão para E / S (como impressão). A maneira mais fácil de silenciar esse aviso é simplesmente adicionar a camada: utf8 à saída, por exemplo, binmode STDOUT, ': utf8'. Outra maneira de desligar o aviso é não adicionar avisos 'utf8'; mas isso geralmente está mais perto de trapacear. Em geral, você deve marcar explicitamente o filehandle com uma codificação, consulte open e perlfunc / binmode.
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.