2010-03-18 3 views
11

He este aviso cada vez que ejecute mi script CGI (salida está dictada por la plantilla :: Toolkit):¿Cómo elimino la advertencia "carácter ancho en la impresión" de TT?

Wide character in print at /usr/local/lib/perl5/site_perl/5.8.9/mach/Template.pm line 163.

¿Cuál es la manera correcta para eliminarlo?

que crear el objeto tt usar este config:

my %config = (
     ENCODING  => 'utf8', 
     INCLUDE_PATH => $ENV{TEMPLATES_DIR}, 
     EVAL_PERL => 1, 
} 
my $tt = Template->new(\%config); 

Respuesta

8

poner esto antes de la llamada a $tt->process() tener la salida codificada de forma automática:

binmode STDOUT, ':utf8'; 

Editar: Como daxim mencionado, es posible utilizar las instalaciones de codificación de TT:

$tt->process($infile, $vars, '-', { binmode => ':utf8' }) 

Esto se basa en la convención ampliamente utilizada de que el nombre de archivo '-' le da STDIN cuando se abre para leer, y STDOUT cuando se abre para escribir.

Editar 2: Por cierto, la última manera no parece funcionar para mí en mod_perl (2.0.5).

+1

http://ahinea.com/es/tech/perl-unicode-struggle.html – Quentin

+0

¿Esto autocodifica la salida en cualquier codificación? Si es así, ¡es genial! – planetp

+0

@planetp: Sí. Ver http://perldoc.perl.org/perlunifaq.html#Is-herehere-a-way-to-automatically-decode-or-encode? –

1
$tt->process($infile, $vars, $outfile, { binmode => ':encoding(UTF-8)' }) 

Esto está documentado en http://search.cpan.org/perldoc?Template#process%28%24template%2C_%5C%25vars%2C_%24output%2C_%25options%29.

+1

Parece que esto solo funciona cuando se imprime en un archivo: 'La única opción admitida actualmente es binmode que, cuando se establece en cualquier valor verdadero, garantizará que los archivos creados (pero no pasados ​​los identificadores de archivos existentes) se establecerán en modo binario. –

+1

Tu especulación es falsa ¿Te importa deshacer tu voto? ¿Por qué no lo pruebaste tú mismo primero en lugar de parlotear? 'Template-> new-> process (\ 'foo [% bar%] quux', {bar =>" \ x {4e71} "}, '-', {binmode => ': codificación (GB2312)'}) ; ' – daxim

+0

Me gustaría que tu respuesta fuera mejor si incluyera este ejemplo y explicara por qué el' 'nombre de archivo' 'especial significa por convención. –

Cuestiones relacionadas