Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Even with meta charset utf-8 tag, It is not working How can I encode it?
  • Comment on HTTP::Server::PSGI outputs broken utf-8 strings

Replies are listed 'Best First'.
Re: HTTP::Server::PSGI outputs broken utf-8 strings
by Anonymous Monk on May 01, 2015 at 06:57 UTC

    HTTP::Server::PSGI outputs broken utf-8 strings

    Even with meta charset utf-8 tag, It is not working How can I encode it?

    You have decided HTTP::Server::PSGI is responsible, but you show no code, or anything to suggest your're correct

    The problem is with your code

    A poor workman blames his tools

      Slow night, so PSGI, Tutorials: perlunitut: Unicode in Perl
      #!/usr/bin/perl -- use strict; use warnings; use HTTP::Server::PSGI; use Encode; my $app = sub { return [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8', ], [ map { Encode::encode( 'UTF-8', $_ ) } ## turn to octets so + Plack::Util doesn't have to qq{<!DOCTYPE html><html lang="en-US"><meta charset="utf- +8"> <title> PSGI is Perl </title><body>}, Encode::decode( 'UTF-8', qq{<h1>I \xe2\x99\xa5 Perl</h1>} ## native "latin1" + string ), ## unicode string qq{<p>I \x{2665} Perl}, ## unicode string '<p>' . ( chr(9829) x 10 ), ## unicode string ], ]; }; my $server = HTTP::Server::PSGI->new( host => "127.0.0.1", port => 9091, timeout => 120, ); $server->run($app); __END__ http://127.0.0.1:9091/

        Good work but we can clean that up a bit. If i may ...

        use strict; use warnings; use HTML::Template; use HTTP::Server::PSGI; use Encode; my $tmpl = HTML::Template->new( filehandle => \*DATA ); $tmpl->param( foo => Encode::decode( 'UTF-8', "\xe2\x99\xa5" ), bar => "\x{2665}", baz => chr(9829) x 10, ); my $app = sub { return [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8', ], [ Encode::encode( 'UTF-8', $tmpl->output ) ], ]; }; my $server = HTTP::Server::PSGI->new( host => "127.0.0.1", port => 9091, timeout => 120, ); $server->run($app); __DATA__ <!DOCTYPE html> <html lang="en-US"> <meta charset="utf-8"> <head><title>PSGI is Perl</title></head> <body> <h1>I <tmpl_var foo> Perl</h1> <p>I <tmpl_var bar> Perl</p> <p><tmpl_var baz> Perl</p> </body> </html>

        Just a friendly reminder to keep your data separated from your code. :)

        jeffa

        L-LL-L--L-LL-L--L-LL-L--
        -R--R-RR-R--R-RR-R--R-RR
        B--B--B--B--B--B--B--B--
        H---H---H---H---H---H---
        (the triplet paradiddle with high-hat)