如何在控制台中正确显示消息?
How to correctly display messages in console?
我使用 mojolicious 应用程序。当我记录一切时,如果一切正常,除了当我在 morbo 下 运行 应用程序时,我看到如下文本:
$app->log->info('тест лога');
[Sat Oct 6 15:22:43 2018] [info] �е�� лога
这里是 utf8 的一些问题。
我应该怎么做才能正确显示消息?
我的终端支持utf8。我 运行 Linux Mint v19.3
这是来自脚本的消息的外观:
测试终端:
尝试 运行 遵循系统中的代码示例。测试确认终端 UTF-8 输出正确
#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
get '/' => sub ($c) {
$c->render(text => 'Hello World!');
};
app->log->info('тест лога');
app->start;
运行 因为 morbo test.pl
产生以下输出
:u99257852:~/work/perl/mojo$ morbo ./test.pl
Web application available at http://127.0.0.1:3000
[2020-10-31 13:33:57.42056] [83940] [info] тест лога
[2020-10-31 13:35:16.72465] [83940] [debug] [hga9Tgyy] GET "/"
[2020-10-31 13:35:16.72528] [83940] [debug] [hga9Tgyy] Routing to a callback
[2020-10-31 13:35:16.72574] [83940] [debug] [hga9Tgyy] 200 OK (0.001078s, 927.644/s)
(uiserver):u99257852:~/work/perl/mojo$
使用 nc localhost 3000
在本地测试
(uiserver):u99257852:~$ nc localhost 3000
GET / HTTP/1.1
HTTP/1.1 200 OK
Date: Sat, 31 Oct 2020 17:35:16 GMT
Server: Mojolicious (Perl)
Content-Type: text/html;charset=UTF-8
Content-Length: 12
Hello World!
uname -a
的输出
(uiserver):u99257852:~/work/perl/mojo$ uname -a
Linux infongwp-us19 4.4.223-icpu-044 #2 SMP Sun May 10 11:26:44 UTC 2020 x86_64 GNU/Linux
(uiserver):u99257852:~/work/perl/mojo$
Bash 是用户的 shell 配置 ~/.bashrc
具有以下设置以支持 UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8:
使用 Mojo::Log 写入 STDERR 时不要使用以下内容:
binmode STDERR, ':encoding(UTF-8)';
Mojo::Log 使用 UTF-8 显式编码它记录的所有内容,即使在写入 STDERR 时也是如此。
sub append {
my ($self, $msg) = @_;
return unless my $handle = $self->handle;
flock $handle, LOCK_EX;
$handle->print(encode('UTF-8', $msg)) or croak "Can't write to log: $!";
flock $handle, LOCK_UN;
}
当使用 STDERR 作为日志输出(默认)时,这与 well-established 向 STD* 添加编码层的做法相冲突。在这种情况下,double-encoding出现。
因此必须避免做
binmode STDERR, ':encoding(UTF-8)';
请注意,这是作为
的一部分完成的
use open ':std', ':encoding(UTF-8)';
我使用 mojolicious 应用程序。当我记录一切时,如果一切正常,除了当我在 morbo 下 运行 应用程序时,我看到如下文本:
$app->log->info('тест лога');
[Sat Oct 6 15:22:43 2018] [info] �е�� лога
这里是 utf8 的一些问题。
我应该怎么做才能正确显示消息?
我的终端支持utf8。我 运行 Linux Mint v19.3
这是来自脚本的消息的外观:
测试终端:
尝试 运行 遵循系统中的代码示例。测试确认终端 UTF-8 输出正确
#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
get '/' => sub ($c) {
$c->render(text => 'Hello World!');
};
app->log->info('тест лога');
app->start;
运行 因为 morbo test.pl
产生以下输出
:u99257852:~/work/perl/mojo$ morbo ./test.pl
Web application available at http://127.0.0.1:3000
[2020-10-31 13:33:57.42056] [83940] [info] тест лога
[2020-10-31 13:35:16.72465] [83940] [debug] [hga9Tgyy] GET "/"
[2020-10-31 13:35:16.72528] [83940] [debug] [hga9Tgyy] Routing to a callback
[2020-10-31 13:35:16.72574] [83940] [debug] [hga9Tgyy] 200 OK (0.001078s, 927.644/s)
(uiserver):u99257852:~/work/perl/mojo$
使用 nc localhost 3000
(uiserver):u99257852:~$ nc localhost 3000
GET / HTTP/1.1
HTTP/1.1 200 OK
Date: Sat, 31 Oct 2020 17:35:16 GMT
Server: Mojolicious (Perl)
Content-Type: text/html;charset=UTF-8
Content-Length: 12
Hello World!
uname -a
(uiserver):u99257852:~/work/perl/mojo$ uname -a
Linux infongwp-us19 4.4.223-icpu-044 #2 SMP Sun May 10 11:26:44 UTC 2020 x86_64 GNU/Linux
(uiserver):u99257852:~/work/perl/mojo$
Bash 是用户的 shell 配置 ~/.bashrc
具有以下设置以支持 UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8:
使用 Mojo::Log 写入 STDERR 时不要使用以下内容:
binmode STDERR, ':encoding(UTF-8)';
Mojo::Log 使用 UTF-8 显式编码它记录的所有内容,即使在写入 STDERR 时也是如此。
sub append {
my ($self, $msg) = @_;
return unless my $handle = $self->handle;
flock $handle, LOCK_EX;
$handle->print(encode('UTF-8', $msg)) or croak "Can't write to log: $!";
flock $handle, LOCK_UN;
}
当使用 STDERR 作为日志输出(默认)时,这与 well-established 向 STD* 添加编码层的做法相冲突。在这种情况下,double-encoding出现。
因此必须避免做
binmode STDERR, ':encoding(UTF-8)';
请注意,这是作为
的一部分完成的use open ':std', ':encoding(UTF-8)';