ОК, я понял это. Проблема была вызвана разрывом между переводом кодировки, выполняемым параметром «encoding ...» вызова «open», и переводом CRLF по умолчанию, выполняемым Perl в Windows. Казалось, что происходило то, что LF переводился в CRLF на выходе после , кодирование уже было сделано, что отбрасывало «четность» 16-битного кодирования для следующей строки. Как только следующая линия была достигнута, «паритет» был возвращен. Это объясняет «длинные строки азиатских символов, перемежающиеся с длинными строками правильного текста» ... каждая другая строка была испорчена.
Чтобы исправить это, я вынул параметр кодирования в моем вызове «open» и добавил вызов «binmode» следующим образом:
open my $f, $fName or die "can't read $fName\n";
binmode $f, ':raw:encoding(UCS-2LE)';
binmode , очевидно, имеет концепцию "многоуровневой" обработки ввода / вывода, которая несколько сложна.
Одна вещь, которую я не могу понять, это как вернуть мой перевод CRLF. Если я опускаю: raw или add: crlf, проблема «четности» возвращается. Я также попробовал сделать повторный заказ и не могу заставить его работать.
(я добавил это отдельным вопросом: Перевод CRLF с Unicode в Perl )