2010-12-20 12 views
5

parece que el conjunto de herramientas de plantillas no está manejando la codificación correctamente.Codificación de caracteres del kit de herramientas de plantillas

Estoy pasando template->process un nombre de archivo (donde obtener la plantilla), una referencia hash (que contiene todos los parámetros), y una referencia escalar (dónde poner la salida) luego la devuelvo y, a su vez, la visualizo el usuario.

Cuando le doy una cadena con diéresis, la salida html incluye un diamante negro con un signo de interrogación blanco en lugar de cada letra (pero el número correcto de letras). Cualquier otro personaje sale bien.

Estoy usando una advertencia para imprimir la cadena antes de hacer la llamada a la plantilla-> proceso y en este punto está bien, por lo que puedo decir es durante la llamada template->process que las cosas se convierten en basura.

¿Alguna idea? He intentado usar ENCODING => "utf8" así como binmode => ":utf8" pero ninguno tiene ningún efecto en la salida.

Aquí está mi código con algo de la grasa recortada solo para mostrar mi llamada a la plantilla-> proceso, tenga en cuenta que si dejo fuera el {binmode => 'utf8'} no tiene ningún efecto.

<put variables in hash referenced to by vars> 
<print out variables in has referenced to by $var> 
my $data; 
$template->process($self->filename, $vars, \$data, {binmode => ':utf8'}) || die "Template process failed: ", $template->error(); 
return $data; 

RESUELTO Hey todo gracias por sus respuestas, el problema resultó ser que después proceso de plantilla había hecho su cosa, entonces escribimos la cadena en un archivo temporal antes de darle salida por lo que también necesario para establecer binmode para el archivo, el código ahora se ve así:

<put variables in hash referenced to by vars> 
<print out variables in has referenced to by $var> 
my $data; 
binmode(STDOUT, ":utf8"); 
$template->process($self->filename, $vars, \$data, {binmode => ':utf8'}) || die "Template process failed: ", $template->error(); 
return $data; 

gracias a todos por su tiempo :)

+0

Probablemente no está relacionado, por intentar pasar UTF-8 en lugar de utf8. A veces es importante, por ejemplo, http://jeremy.zawodny.com/blog/archives/010546.html – Hugmeir

+2

¿Se está mutilando el texto UTF-8 o el navegador simplemente no está recogiendo la codificación correcta? –

+0

Si fuera el último, ¿cómo podría decirle al navegador qué codificación usar? Usando HTML template pro (el sistema desde el que nos movemos) los caracteres se muestran correctamente. Esto me llevó a creer que era TT, pero podría estar equivocado. Ahora en el tren, tendré que probar cualquier sugerencia mañana por la mañana. – cjh

Respuesta

6

El siguiente código funciona. $data, específicamente las cadenas contenidas deben ser cadenas Perl, es decir, decode d. Vea el introduction to encoding in the official documentation.

use Template '2.21_02'; 

my $tt = Template->new({ 
    ENCODING  => 'utf8', 
    # other options … 
}); 

$tt->process(
    $template, $data, $output, {binmode => ':utf8'} 
) or die $tt->error . ' in ' . $template; 
+1

Creo que esto es exactamente lo que dijo el suicida que intentó en la pregunta original, ¿no? –

+0

No.Dijo que no funcionó, y afirmé que funciona. También escribí sobre una pieza faltante en el rompecabezas. – daxim

+0

Aceptado, aunque fue lo que escribí, esto también responde la pregunta que hice. El toolkit de plantillas maneja la codificación fina. Gracias a todos. – cjh

1

Mi solución fue p unt, y todos los caracteres no latinos entran en en.po para ser incluidos en tiempo de ejecución a través de [% loc('string') %] y eso funciona bien para mí ya que mis plantillas tenían que ser localizadas de todos modos.

+0

Gracias por su respuesta, sin embargo, en mi caso son datos proporcionados por el usuario y hay muchas plantillas, por lo que hacer esto no es realmente una opción – cjh

+1

@suicideducky - Luego pruebe Template :: Plugin :: Decode y use '| decode' después de cada una de sus cadenas de usuario –

Cuestiones relacionadas