2011-06-02 18 views
8

Debido a varias razones, recibo los mensajes de error Malformed UTF-8 character y Wide character in print desde un script heredado.¿Cómo elimino las advertencias UTF-8 en Perl?

Me gustaría suprimir/deshabilitar esas dos advertencias para que no se escriban en STDERR.

¿Cómo puedo hacer eso?

Respuesta

6
no warnings 'utf8'; 

Pero es mejor averiguar por qué está recibiendo la advertencia y solucionar el problema subyacente. Esas dos advertencias indican que algo va mal en tu script. La supresión de las advertencias no solucionará el error.

5

Aquí hay dos ejemplos para ayudarle a entender los errores:

[email protected]: ~/Milu/Dev/Perl > cat malformed-utf8-char.pl 
use utf8; # script source must be in UTF-8 
use strict; 
use warnings; 
print "K�se\n"; 
[email protected]: ~/Milu/Dev/Perl > perl malformed-utf8-char.pl 
Malformed UTF-8 character (unexpected non-continuation byte 0x73, 
immediately after start byte 0xe4) at malformed-utf8-char.pl line 4. 
Kse 

La fuente está en Latin-1, mi terminal está en UTF-8. La cadena es en realidad "Käse". El pragma utf8 debe eliminarse o la fuente debe guardarse en UTF-8.

[email protected]: ~/Milu/Dev/Perl > cat wide-char-in-print.pl 
use utf8; 
use strict; 
use warnings; 
# binmode STDOUT, ':utf8'; 
print "Группа сайтов РИА Новости\n"; 
[email protected]: ~/Milu/Dev/Perl > perl wide-char-in-print.pl 
Wide character in print at wide-char-in-print.pl line 5. 
Группа сайтов РИА Новости 

La fuente contiene caracteres cirílico, de ahí el utf8 pragma está en orden. Sin embargo, para imprimir esos caracteres en el terminal, STDOUT también debe establecerse en UTF-8, lo que puede lograr llamando al binmode. Si no lo hace, se activa una advertencia ya que un carácter ancho (Unicode más allá de 0x255) no entra por un canal de salida estrecho (byte). Todavía se verá correctamente, porque Perl simplemente generará los bytes tal como son, lo que luego parece correcto.

+1

en mi opinión esta es la mejor respuesta porque en vez de decirle a los nuevos programadores cómo desactivar la advertencia "molesta", lo cual no debes hacer si no entiendes por qué los obtienes, te dice cómo evitar recibir esa advertencia en primer lugar. La mayoría de las advertencias están ahí para ayudarlo a solucionar un problema de su lado. Escuché en alguna parte que el 99.999% de las veces, el programador, no la computadora/compilador/intérprete es el problema. Es fácil apagar esta advertencia, pero tener el hábito de simplemente cerrar las molestias es malo, por decir lo menos. – osirisgothra

12

Presumiblemente, usted está trabajando en utf8. Tienes que activar el manejo de utf8 para cada identificador de archivo.

binmode STDERR, ":encoding(utf8)"; 

Puede hacer esto para todos los estándar maneja con use open ":encoding(utf8)". Vea open para más información.

Finalmente, puede utf8-ify todo, su código, sus manejadores de archivos y sus argumentos, con utf8::all.

Nota que :utf8 se convierte en el manejo UTF-8, pero :encoding(utf8) comprueba los datos son válidos UTF-8, por lo que es más seguro. Ver perldoc -f binmode para más detalles.

1

tenía el mismo problema con la salida de depuración de Log4perl usando Perl en consola de Windows PowerShell

Wide character in print at C:/strawberry/perl/site/lib/Log/Log4perl/Appender/Screen.pm line 39. 

Las soluciones era (en el archivo de Log4perl config)

log4perl.appender.Screen.utf8 = 1 
Cuestiones relacionadas