显示无效 UTF-8 的 Mojolicious 模板

Mojolicious template displaying invalid UTF-8

我正在使用 Mojolicious (not Lite) together with 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>
  ...

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

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

为什么在终端显示正确,在模板中显示不正确?

备注:

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

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

就这么简单。不确定为什么它在终端上正确显示...可能 "Dumper" 正在转换它?

Why it is not displayed correctly in the template?

当您从 Redis 获取值时 - 您将获取字节序列。您应该将该八位字节解码为 utf8。正如您 decode_utf8($val) 所做的那样。

Not sure why its displayed correctly on the terminal... Probably "Dumper" is converting it?

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

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

Here is full list of recommendations