如何在控制台中正确显示消息?

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)';