in reply to Template Toolkit and different encodings

Just to clarify a bit on what ikegami said above (and just to prove it for myself), here's a little test script to demonstrate a run-time choice of output encoding. When you run this on the command line with no args, the output will be iso-8859-15; when you add "utf8" as an option, that will be the output encoding. The template is the same in both cases.
#!/usr/bin/perl use strict; use warnings; use Template; use Encode; my $encoding = 'iso-8859-15'; my @testchars = map { encode( $encoding, chr( $_ )) } ( 0xc0 .. 0xff ) +; if ( @ARGV and $ARGV[0] eq 'utf8' ) { $_ = decode( $encoding, $_ ) for ( @testchars ); $encoding = 'utf8'; } my $tmpfile = "test.$$.tt"; open( TMP, ">", "/tmp/$tmpfile" ) or die "/tmp/$tmpfile: $!"; print TMP while (<DATA>); close TMP; binmode STDOUT, "encoding($encoding)"; my $tt = Template->new( INCLUDE_PATH => "/tmp" ) or die "template init. error\n"; $tt->process( $tmpfile, { enc => $encoding, testchars => \@testchars } + ) or die "template proc. error\n"; __DATA__ <html> <p>This page should be using [% enc %].</p> <table> [% FOREACH i IN [ 0 .. 3 ] -%] <tr> [% FOREACH j IN [ 0 .. 15 ] %] [%- k = i * 16 + j -%] <td>[% testchars.$k %]</td> [% END -%] </tr> [% END -%] </table> </html>

Replies are listed 'Best First'.
Re^2: Template Toolkit and different encodings
by morgon (Priest) on Dec 23, 2010 at 11:14 UTC
    Thanks a lot for your feedback.

    One thing thougth:

    I will use TT via CGI::Application::Plugin::TT running under mod_perl.

    Does that change anything?

      I will use TT via CGI::Application::Plugin::TT

      That's how I normally use TT as well. (I had to go back to the manual to see about running it by itself.)

      Does that change anything?

      No -- just make sure that STDOUT is set to the same encoding as the template string variables, as shown in the example; then use the plugin syntax in the normal way to invoke the TT "process" function.

      If you're sending HTML to a client, you might want to look up how CGI::Application manages the MIME header that precedes the <html> tag, so that the client (browser) knows what encoding to use. But if you're sending XML, then starting the template like this should suffice:

      <?xml version="1.0" encoding="[% enc %]" ?>
        I will use TT via CGI::Application::Plugin::TT
        Does that change anything?

        No -- just make sure that STDOUT is set to the same encoding as the template string variables.

        Unfortunatly I can't get it to work at the moment.

        I run TT via CGI::Application::Plugin::TT under mod_perl.

        I need to generate output as UTF-8 and ISO-8851-1.

        The templates do not contain anything that would make a difference with respect to the encoding, so the problem is getting the template-variables encoded properly.

        The variables come from a database that uses utf-8.

        My understanding was that the TT-Plugin creates a string that is eventually printed to STDOUT to communicate the response to apache.

        So I thought changing the encoding of STDOUT via binmode would be sufficient, but it does not work - I get utf-8 regardless of what I set the encoding of STDOUT to.

        So I assume mod_perl and apache communicate not via STDOUT...can someone help me here?

        Many thanks!