在 Perl 中打印 UTF8?

Ric*_*cky 3 unicode perl

为什么添加use utf8pragma 会产生乱码输出(见下文)与我不使用此 pragma 时相比

编码:

use strict;
use v5.10;
use Data::Dumper;
# if I comment this line out, then the results print fine
use utf8;

my $s = {
    'data' => 'The size is 200 ?g'
};

say Dumper( $s );
Run Code Online (Sandbox Code Playgroud)

结果没有use utf8

$VAR1 = {
          'data' => 'The size is 200 ?g'
        };
Run Code Online (Sandbox Code Playgroud)

结果使用use utf8

$VAR1 = {
          'data' => "The size is 200 \x{3bc}g"
        };
Run Code Online (Sandbox Code Playgroud)

感谢您的任何见解

Gri*_*nnz 6

它不是乱码,而是此处列出的默认“Useqq”配置选项的标准 Data::Dumper 转义。Data::Dumper 是为调试而设计的,因此此选项可让您查看可能无法打印的确切字符。

如果没有use utf8;,您的字符串实际上包含该字符的 UTF-8 编码字节而不是字符本身,因为这是文件包含的内容。您可以通过检查字符串的长度来验证这一点。use utf8;导致解释器从 UTF-8 解码源代码,包括您的文字字符串。

为了打印此类字符,需要将其编码回 UTF-8 字节。您可以直接执行此操作:

use strict;
use warnings;
use utf8;
use Encode 'encode';
print encode 'UTF-8', 'The size is 200 ?g';
Run Code Online (Sandbox Code Playgroud)

或者你可以在 STDOUT 上设置一个编码层,这样所有打印的文本都将被编码为 UTF-8:

use strict;
use warnings;
use utf8;
binmode *STDOUT, ':encoding(UTF-8)';
print 'The size is 200 ?g';
Run Code Online (Sandbox Code Playgroud)

编码为 UTF-8 以进行 Data::Dumper 调试通常是不必要的,因为它已经为您的视图转义了此类字符。