Si ejecuto el siguiente programa Perl:
perl -e 'use utf8; print "鸡\n";'
Recibo esta advertencia:
Wide character in print at -e line 1.
Si ejecuto este programa Perl:
perl -e 'print "鸡\n";'
No recibo ninguna advertencia.
Pensé que use utf8
era necesario utilizar caracteres UTF-8 en un script de Perl. ¿Por qué no funciona y cómo puedo solucionarlo? Estoy usando Perl 5.16.2. Tengo el mismo problema si esto está en un archivo en lugar de ser una línea en la línea de comando.
Respuestas:
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: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.
fuente
-Mutf8
si no en una sola línea perl?use utf8;
Todo lo que
use utf8;
hace es decirle a Perl que el código fuente está codificado usando UTF-8. Necesita decirle a Perl cómo codificar su texto:use open ':std', ':encoding(UTF-8)';
fuente
Codifique toda la salida estándar como UTF-8:
binmode STDOUT, ":utf8";
fuente
use open ':std', ':encoding(UTF-8)';
como lo propone otra respuesta, hace esto para STDOUT pero también marca STDERR y STDIN como UTF-8, por lo que obtiene tres por el precio de una declaración. Véase también stackoverflow.com/a/42194059Puede acercarse a "simplemente hacer utf8 en todas partes" utilizando el módulo CPAN
utf8::all
.perl -Mutf8::all -e 'print "鸡\n";'
Cuando
print
recibe algo que no puede imprimir (carácter mayor a 255 cuando no:encoding
se proporciona ninguna capa), se supone que pretendía codificarlo usando UTF-8. Lo hace después de advertir sobre el problema.fuente
Puedes usar esto,
También terminará ese error.
fuente
En español puede encontrar este error al lado de comenzar a usar:
use utf8;
La codificación de su editor tiene una codificación diferente. Entonces, lo que ves en el editor no es lo que hace Perl. Para resolver ese error, simplemente cambie la codificación del editor a Unicode / UTF-8 .
fuente