下面是尝试将 koi8-r 单字节编码的文本输出到浏览器的代码。 我把它保存在 koi8-r 的 Emacs 中:
#!/usr/bin/perl
use Mojolicious::Lite;
no utf8;
get '/' => sub {
my $c = shift;
$c->res->headers->content_type('text/plain; charset=KOI8-R');
# Respond with plain text
$c->render(text => "Hello, World! Текст на русском однобитный.");
};
app->start;
我工作,但不是“你好,世界!Текст на русском однобитный”。在 Firefox 中我看到:
你好,世界! ц╢ц┘ц▀ц⌠ц■ ц▌ц│ ц▓ц∙ц⌠ц⌠ц▀ц▐ц█ ц▐ц└ц▌ц▐ц┌ц┴ц■ц▌ц≥ц┼.
单击“查看”-“修复文本编码”后,我得到:
你好,世界! ôËÓÔ ÎÁ ÒÕÓÓËÏÍ ÏäÎÏâÉÔÎÙÊ。
我似乎是在 Windows-1252 而不是 koi8-r 中解释“Текст на русском однобитный”,这就是为什么我看到“ôÅËÓÔ ÎÁ ÒÕÓÓËÏÍ ÏäÎÏÂÉÔÎÙÊ”。
出了什么问题?也许
render
函数无法使用单字节编码?
试试这个:
#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use utf8;
get '/' => sub {
my $c = shift;
$c->res->headers->content_type('text/plain; charset=UTF-8');
# Respond with plain text
$c->render(text => "Hello, World! Текст на русском однобитный.");
};
app->start;
您可以使用
data
而不是 text
作为渲染目标。数据仅发送原始字节,并且不由 Mojolicious::Renderer
的集合 encoding
进行编码。我也尝试过设置 app->renderer($encoding)
但浏览器仍然渲染不正确,所以我认为使用 bytes 是唯一的方法。
#!/usr/bin/perl
use Mojolicious::Lite;
no utf8;
my $encoding = 'koi8-r';
get '/' => sub {
my $c = shift;
$c->res->headers->content_type("text/html;charset=$encoding");
$c->render( data => 'Hello, World! Текст на русском однобитный.' );
};
app->start;