Sin use utf8
Perl interpreta su cadena como una secuencia de caracteres de un solo byte. Hay cuatro bytes en su cadena como puede ver en esto:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
Los primeros tres bytes forman tu personaje, el último es el salto de línea.
La llamada a print
envía estos cuatro caracteres a STDOUT. Luego, su consola averigua cómo mostrar estos caracteres. Si su consola está configurada para usar UTF8, interpretará esos tres bytes como su único carácter y eso es lo que se muestra.
Si agregamos en el utf8
módulo, las cosas son diferentes. En este caso, Perl interpreta su cadena como solo dos caracteres.
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
Por defecto, la capa IO de Perl asume que está trabajando con caracteres de un solo byte. Entonces, cuando intenta imprimir un carácter de varios bytes, Perl piensa que algo anda mal y le da una advertencia. Como siempre, puede obtener más explicación de este error si incluye use diagnostics
. Dirá esto:
(S utf8) Perl encontró un carácter amplio (> 255) cuando no esperaba uno. Esta advertencia está activada de forma predeterminada para E / S (como impresión). La forma más fácil de silenciar esta advertencia es simplemente agregar la capa: utf8 a la salida, por ejemplo, binmode STDOUT, ': utf8'. Otra forma de desactivar la advertencia es no agregar advertencias 'utf8'; pero eso suele estar más cerca de hacer trampa. En general, se supone que debe marcar explícitamente el identificador de archivo con una codificación, consulte open y perlfunc / binmode.
Como otros han señalado, debe indicarle a Perl que acepte la salida de varios bytes. Hay muchas formas de hacer esto (consulte el Tutorial de Perl Unicode para ver algunos ejemplos). Una de las formas más sencillas es usar el -CS
indicador de línea de comando, que le dice a los tres identificadores de archivos estándar (STDIN, STDOUT y STDERR) que se ocupen de UTF8.
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
vs
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
Unicode es un área grande y compleja. Como ha visto, muchos programas simples parecen hacer lo correcto, pero por razones equivocadas. Cuando comience a arreglar parte del programa, las cosas a menudo empeorarán hasta que haya arreglado todo el programa.