Если вы просто укажете «UTF-16», Perl будет искать метку порядка байтов (BOM), чтобы выяснить, как ее анализировать.Если нет спецификации, она взорвется.В этом случае вы должны указать Encode, какой у вас порядок байтов, указав либо «UTF-16LE» для little-endian, либо «UTF-16BE» для big-endian.
Есть что-то еще, что происходит сВаша ситуация, хотя, но трудно сказать, не видя данных, которые у вас есть в файле.Я получаю одинаковую ошибку с обоими фрагментами.Если у меня нет спецификации и я не указываю порядок байтов, мой Perl жалуется в любом случае.Какой Perl вы используете и какую платформу используете?Есть ли у вашей платформы нативная последовательность вашего файла?Я думаю, что поведение, которое я вижу, является правильным в соответствии с документами.
Кроме того, вы не можете просто прочитать строку в какой-то неизвестной кодировке (какой бы ни была настройка по умолчанию в Perl), а затем отправить ее в decode
.Вы можете оказаться в середине многобайтовой последовательности.Вы должны использовать Encode::FB_QUIET
, чтобы сохранить часть буфера, которую вы не смогли декодировать, и добавить ее к следующему фрагменту данных:
open my($lefh), '<:raw', 'text-utf16.txt';
my $string;
while( $string .= <$lefh> ) {
print decode("UTF-16LE", $string, Encode::FB_QUIET)
}