Perl 如何在控制台中正确显示消息?
我用的是一种迷人的应用程序。当我做日志记录时,如果一切正常,除了在morbo下运行应用程序,我会看到如下文本:Perl 如何在控制台中正确显示消息?,perl,utf-8,mojolicious,Perl,Utf 8,Mojolicious,我用的是一种迷人的应用程序。当我做日志记录时,如果一切正常,除了在morbo下运行应用程序,我会看到如下文本: $app->log->info('тест лога'); [Sat Oct 6 15:22:43 2018] [info] Ñ�еÑ�Ñ� лога utf8有一些问题 我应该怎么做才能正确显示消息? 我的终端支持utf8。我运行LinuxMintV19.3 以下是来自脚本的消息的外观: 测试终端: 尝试在系统中运行以下代码示例。测试通过终端中正确的UT
$app->log->info('тест лога');
[Sat Oct 6 15:22:43 2018] [info] �е�� лога
utf8有一些问题
我应该怎么做才能正确显示消息?
我的终端支持utf8。我运行LinuxMintV19.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
尝试在系统中运行以下代码示例。测试通过终端中正确的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
在使用Mojo::Log写入STDERR时,不要使用以下命令:
binmodestderr':编码(UTF-8)';
日志使用UTF-8显式地对它记录的所有内容进行编码,即使在写入STDERR时也是如此
子追加{
我的($self,$msg)=@;
返回,除非my$handle=$self->handle;
flock$手柄,锁紧;
$handle->print(encode('UTF-8',$msg))或croak“无法写入日志:$!”;
拉手,锁;
}
当使用STDERR作为日志输出(默认值)时,这与向STD*添加编码层的既定实践相冲突。在这种情况下,会发生双重编码
因此,我们必须避免这样做
binmodestderr':编码(UTF-8)';
请注意,这是作为
use open ':std', ':encoding(UTF-8)';
在使用Mojo::Log写入STDERR时,不要使用以下命令:
binmodestderr':编码(UTF-8)';
日志使用UTF-8显式地对它记录的所有内容进行编码,即使在写入STDERR时也是如此
子追加{
我的($self,$msg)=@;
返回,除非my$handle=$self->handle;
flock$手柄,锁紧;
$handle->print(encode('UTF-8',$msg))或croak“无法写入日志:$!”;
拉手,锁;
}
当使用STDERR作为日志输出(默认值)时,这与向STD*添加编码层的既定实践相冲突。在这种情况下,会发生双重编码
因此,我们必须避免这样做
binmodestderr':编码(UTF-8)';
请注意,这是作为
use open ':std', ':encoding(UTF-8)';
您没有指定运行脚本的操作系统。也许您使用的MS Windows不是针对俄罗斯的本地化版本。在这种情况下,您需要在terminalchcp 65001
中发布以切换代码页以支持UTF-8。我使用Linux Mint v19.3,如果您在terminal中使用“tituteöССаа”编辑一些文件,它是否以可读形式打印?只是为了确认为UTF-8调优的终端。也许默认情况下,mojo没有为UTF-8输出设置。尝试在主文件binmode STDOUT':encodin(UTF-8)
的开头添加。注意:如果前一行没有帮助,日志工具可以使用STDERR-:encoding
,而不是:encodin
,顺便说一句。您没有指定运行脚本的操作系统。也许您使用的MS Windows不是针对俄罗斯的本地化版本。在这种情况下,您需要在terminalchcp 65001
中发布以切换代码页以支持UTF-8。我使用Linux Mint v19.3,如果您在terminal中使用“tituteöССаа”编辑一些文件,它是否以可读形式打印?只是为了确认为UTF-8调优的终端。也许默认情况下,mojo没有为UTF-8输出设置。尝试在主文件binmode STDOUT':encodin(UTF-8)
的开头添加。注意:如果前一行没有帮助,日志工具可以使用STDERR-:encoding
,而不是:encodin
,顺便说一句。感谢您提供关于binmode的提示。我发现了问题。我会在不同的答案上发布,但可能我们需要将其合并到您的OneNote中感谢您对binmode的提示。我发现了问题。我会把它贴在不同的答案上,但我们可能需要把它合并到你的答案中