我正在使用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>
...
但它显示的值如:ãããã。
在浏览器中手动更改字符集没有任何区别(它没有按预期显示)。
为什么如果它在终端中正确显示,它在模板中无法正确显示?
答案 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
主要规则是:当您从外部源获取字节时,必须将它们转换为内部表示。