显示无效 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>
...
但它显示的值如下:ãã¹ã。
在浏览器中手动更改字符集没有任何区别(未按预期显示)。
为什么在终端显示正确,在模板中显示不正确?
备注:
- 我使用了 base64 encode/decode 并且它没有改变(我确定它不是 Redis)。
- 我正确安装了日文字体和设置(我已经使用日文编码多年,但我第一次使用 Mojolicious 模板完成这项任务)。
- 所有文件都以 UTF-8 格式保存(未使用其他编码)。
- 如果我在模板(硬编码)中用日语写一些东西,它会正确显示。
我不想回答自己的问题..但我找到了解决方案:
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
我正在使用 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>
...
但它显示的值如下:ãã¹ã。
在浏览器中手动更改字符集没有任何区别(未按预期显示)。
为什么在终端显示正确,在模板中显示不正确?
备注:
- 我使用了 base64 encode/decode 并且它没有改变(我确定它不是 Redis)。
- 我正确安装了日文字体和设置(我已经使用日文编码多年,但我第一次使用 Mojolicious 模板完成这项任务)。
- 所有文件都以 UTF-8 格式保存(未使用其他编码)。
- 如果我在模板(硬编码)中用日语写一些东西,它会正确显示。
我不想回答自己的问题..但我找到了解决方案:
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