Wenn Sie einfach "UTF-16" angeben, sucht Perl nach dem Byte-Order-Mark (BOM), um herauszufinden, wie es zu parsen ist. Wenn es kein BOM gibt, wird es explodieren. In diesem Fall müssen Sie Encode mitteilen, welche Bytereihenfolge Sie haben, indem Sie entweder "UTF-16LE" für Little-Endian oder "UTF-16BE" für Big-Endian angeben.
Es gibt noch etwas anderes, was in Ihrer Situation vor sich geht, aber es ist schwer zu sagen, ohne die Daten in Ihrer Datei zu sehen. Ich erhalte den gleichen Fehler mit beiden Snippets. Wenn ich keine Stückliste habe und keine Bytereihenfolge angebe, beschwert sich mein Perl so oder so. Welches Perl verwenden Sie und welche Plattform haben Sie? Gibt es auf Ihrer Plattform die native Endianness Ihrer Datei? Ich denke, das Verhalten, das ich sehe, ist laut der Dokumentation korrekt.
Außerdem können Sie nicht einfach eine Zeile in einer unbekannten Kodierung lesen (was auch immer Perls Standard ist) und diese dann an decode
. Sie könnten in der Mitte einer Multi-Byte-Sequenz landen. Sie müssen Encode::FB_QUIET
um den Teil des Puffers zu speichern, den Sie nicht dekodieren konnten, und ihn zum nächsten Datenpaket hinzuzufügen:
open my($lefh), '<:raw', 'text-utf16.txt';
my $string;
while( $string .= <$lefh> ) {
print decode("UTF-16LE", $string, Encode::FB_QUIET)
}