Печать UTF8 в Perl? - PullRequest
       3

Печать UTF8 в Perl?

2 голосов
/ 23 января 2020

Почему добавление прагмы use utf8 приводит к искаженному выводу (см. Ниже) по сравнению с тем, когда я не использую эту прагму

Код:

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

Результаты без use utf8 :

$VAR1 = {
          'data' => 'The size is 200 μg'
        };

Результаты с использованием use utf8:

$VAR1 = {
          'data' => "The size is 200 \x{3bc}g"
        };

Спасибо за любые идеи

1 Ответ

6 голосов
/ 23 января 2020

Это не искажено, но стандартное экранирование Data :: Dumper с параметром конфигурации "Useqq" по умолчанию, перечисленным здесь . 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';

Или вы можете установить слой кодирования на STDOUT, чтобы весь напечатанный текст был закодирован в UTF-8:

use strict;
use warnings;
use utf8;
binmode *STDOUT, ':encoding(UTF-8)';
print 'The size is 200 μg';

Кодировка в Отладка UTF-8 для Data :: Dumper, как правило, не нужна, поскольку она уже не содержит таких символов для вашего представления.

...