[Catalyst] Avoiding UTF8 in Catalyst

Marc SCHAEFER schaefer at alphanet.ch
Sat Nov 21 22:22:47 GMT 2009


Hi,

my goal: no UTF8, in short:

   - all the perl code, all the data files, all the template files and
     the UNIX locale are all in ISO-8859-1

   - the HTML result should be in ISO-8859-1
     (Content-Type: text/html; charset=iso-8859-1)

   - the Content-Length: should be correct.

First, I modified lib/MyApp/View/TT.pm as follows:

   __PACKAGE__->config(TEMPLATE_EXTENSION => '.tt',
                       DEFAULT_ENCODING   => 'ISO-8859-1',
                       WRAPPER => 'wrapper.tt');

Apparently all diacritic characters are expanded into HTML entities.
Which is functional, but not optimal.  However, with FormFu, this
unnecessary expansion doesn't happen, which is fine. 

I got the following result:

   - the HTML data is in ISO-8859-1 (or as HTML entities, which is
     acceptable as a work-around) as wanted
   - however the HTTP header charset is UTF8

After looking at line 45 of
   /usr/local/share/perl/5.8.8/Catalyst/Action/RenderView.pm
it looks that the utf-8 charset HTTP header is hardcoded. I have thus modified
my lib/MyApp/Controller/Root.pm to do the following in
end : ActionClass('RenderView'):

   $c->response->content_type('text/html; charset=iso-8859-1');

With this, I got the following result:

   - the HTML data is in ISO-8859-1 as wanted (no change, logical)
   - the HTTP header charset is now the correct iso-8859-1
   - however, the Content-Length: sent is wrong.

After investigating, the Content-Length: is one off per non 7-bit
character. As if the standard iso-8859-1 byte stream was sent as
is, but was, internally converted to UTF-8 just for generating
a wrong byte count. Very strange.  Normally that process should really
output something wrong or generate an error in the conversion. It
doesn't.

My questions:

   - is there a better way to use the standard charset than to do all
     of the above hacks ?

   - if not, how to work-around the content length in
      end : ActionClass('RenderView') ?  Unfortunately, it looks like
     $c->result->body is undefined at this point, and that
     $c->finalize_body() doesn't do anything useful.

Version info:
 Catalyst 5.80007 and 5.80013

PS: I wouldn't have noticed the Content-Length: issue if I hadn't use a
    reverse proxy.  With that reverse proxy, and the standalone Catalyst
    server, you get 5-10 seconds hangs if the Content-Length is too big,
    which is what happens with this strange UTF8 behaviour. Without it,
    the size is wrong (as seen by wireshark != PageInfo Firefox), but
    the WWW client seems to compensate.

PS/2: the http://www.catb.org/~esr/faqs/smart-questions.html URL doesn't
      work currently, so maybe my question is unsmart.



More information about the Catalyst mailing list