Mojolicious模板显示无效的UTF-8

时间:2016-04-27 08:42:32

标签: encoding utf-8 mojolicious

我正在使用Mojolicious(不是Lite)和CPAN::Redis

我正在以这种方式存储一些日文编码的数据:

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

稍后在代码中我从redis中读取了这个值:

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

模板:

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

但它显示的值如:ãããã。

在浏览器中手动更改字符集没有任何区别(它没有按预期显示)。

为什么如果它在终端中正确显示,它在模板中无法正确显示?

注意:

  • 我使用了base64编码/解码,它没有改变(我确定它不是Redis)。
  • 我正确安装了日语字体和设置(我多年来一直使用日语编码,但我第一次使用Mojolicious模板完成此任务)。
  • 所有文件都以UTF-8保存(未使用其他编码)。
  • 如果我在模板中用日文写一些东西(硬编码),它就会正确显示。

2 个答案:

答案 0 :(得分:2)

我不想回答我自己的问题..但我找到了解决方案:

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

这很简单。不确定为什么它在终端上正确显示......可能&#34; Dumper&#34;转换它?

答案 1 :(得分:2)

  

为什么它在模板中无法正确显示?

当你从redis获得价值时 - 你会获得一系列字节。你应该将这个八位字节解码为utf8。正如你在decode_utf8($val)所做的那样。

  

不确定为什么它在终端上正确显示...可能&#34; Dumper&#34;转换它?

你的终端用utf8标志打开了。在转储时,只需将八位字节传递给终端,即可发出Wide character in print at。但是字符显示正确,因为终端理解utf8

主要规则是:当您从外部源获取字节时,必须将它们转换为内部表示。

Here is full list of recommendations