Да, вы делаете что-то не так.Вы неправильно поняли, что означает ссылка, которую вы упомянули .Dump
& Load
работа с необработанными байтами UTF-8;то есть строки, содержащие UTF-8, но с выключенным флагом UTF-8 .
Когда вы печатаете эти байты в дескриптор файла со слоем :utf8
, они интерпретируются как Latin-1 ипреобразован в UTF-8, производя двойной кодированный вывод (который может считываться успешно, пока вы дважды декодируете его).Вместо этого вы хотите binmode STDOUT, ':raw'
.
Другой вариант - вызвать utf8 :: decode в строке, возвращаемой Dump
.Это преобразует необработанные байты UTF-8 в символьную строку (с включенным флагом UTF-8).Затем вы можете распечатать строку в :utf8
файловом дескрипторе.
Таким образом, либо
use utf8;
binmode STDOUT, ":raw";
my $hash = {č => "ř"}; #czech letters with unicode codes U+010D and U+0159
use YAML::XS;
my $s = YAML::XS::Dump($hash);
print $s;
Или
use utf8;
binmode STDOUT, ":utf8";
my $hash = {č => "ř"}; #czech letters with unicode codes U+010D and U+0159
use YAML::XS;
my $s = YAML::XS::Dump($hash);
utf8::decode($s);
print $s;
Аналогично, при чтении из файла выхотите читать в режиме :raw
или использовать utf8::encode
в строке перед передачей ее в Load
.
Когда это возможно, вы должны просто использовать DumpFile
& LoadFile
, позволяя YAML :: XSправильно открыть файл.Но если вы хотите использовать STDIN / STDOUT, вам придется иметь дело с Dump
& Load
.