2016-04-27 12 views
0

Ich verwende Mojolicious (nicht Lite) zusammen mit CPAN::Redis.Mojolicious-Vorlage mit ungültigem UTF-8

ich einige Daten bin zu speichern, die auf diese Weise japanischen codierter ist:

use Redis; 
my $redis = Redis->new; 
$redis->set("mykey",$val); 
# $val contains a string which was read from a file. 
# The value looks like: テスト 

Später im Code, den ich diesen Wert von redis lesen:

my $val = $redis->get("mykey"); 
print Dumper($val); #the value prints correctly in terminal 
$self->stash(
    myvalue => $val 
); 
$self->render(
    template => "/pages/test" 
); 

Und die Vorlage:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Test</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </head> 
    <body> 
    <div><%= $myvalue %></div> 
    ... 

Aber es zeigt den Wert wie: ãã¹ã.

Das manuelle Ändern des Zeichensatzes im Browser macht keinen Unterschied (er wird nicht wie erwartet angezeigt).

Warum, wenn es korrekt im Terminal angezeigt wird, wird es nicht korrekt in der Vorlage angezeigt?

Hinweise:

  • I Base64 Encoder/Decoder verwendet, und es ändert sich nicht (ich bin sicher, dass Redis seines nicht).
  • Ich habe japanische Schriftarten und Einstellungen richtig installiert (Ich habe mit japanischen Kodierungen seit vielen Jahren gearbeitet, aber das erste Mal verwende ich Mojolicious Vorlagen für diese Aufgabe).
  • Alle Dateien werden in UTF-8 gespeichert (keine andere Kodierung wird verwendet).
  • Wenn ich etwas in Japanisch in der Vorlage (hart codiert) schreibe, wird es korrekt angezeigt.

Antwort

1

Ich hasse meine eigenen Fragen zu beantworten .. aber ich fand die Lösung:

use Encode qw(decode_utf8); 
... 
$self->stash(
    myvalue => decode_utf8($val) 
); 

So einfach ist das. Nicht sicher, warum es richtig auf dem Terminal angezeigt wird ... Wahrscheinlich "Dumper" konvertiert es?