Вот простой скрипт, который Perl должен написать UTF-8 закодированный файл:В какой кодировке readpipe возвращает результат выполненной команды?
use warnings;
use strict;
open (my $out, '>:encoding(utf-8)', 'tree.out') or die;
print $out readpipe ('tree ~');
close $out;
Я ожидал readpipe вернуть UTF-8 закодированную строку, так как LANG
установлен в en_US.UTF-8
. Тем не менее, глядя на tree.out
(при этом убедитесь, что редактор распознает его как кодировку utf-8) показывает мне весь искаженный текст.
Если изменить >:encoding(utf-8)
в открытом заявлении >:encoding(latin-1)
, сценарий создает UTF-8 файл с ожидаемым текста.
Это все немного странно для меня. Каково объяснение этого поведения?
См. [Enocde :: Locale] (https://metacpan.org/pod/Encode::Locale), как включить информацию о локали. Для вашей текущей проблемы: 'readpipe' возвращает байты (которые будут уже закодированы как UTF-8). PerlIO layer '>: encoding (utf-8)' будет закодировать его еще раз, когда вы напечатаете его в файл. Преобразование строки байта в строку Perl перед печатью в файл. Например, используйте 'Encode :: decode()' –