/ / Wie kann ich UTF-16-Daten in Perl dekodieren, wenn ich die Byte-Reihenfolge nicht kenne? - perl, decodieren, utf-16

Wie kann ich UTF-16-Daten in Perl entschlüsseln, wenn ich die Byte-Reihenfolge nicht kenne? - Perl, dekodieren, utf-16

Wenn ich eine Datei öffne (und eine Kodierung direkt angeben):

open(my $file,"<:encoding(UTF-16)","some.file") || die "error $!n";
while(<$file>) {
print "$_n";
}
close($file);

Ich kann den Inhalt der Datei gut lesen. Wenn ich jedoch:

use Encode;

open(my $file,"some.file") || die "error $!n";
while(<$file>) {
print decode("UTF-16",$_);
}
close($file);

Ich erhalte den folgenden Fehler:

UTF-16:Unrecognised BOM d at F:/Perl/lib/Encode.pm line 174

Wie kann ich damit arbeiten? decode?

EDIT: Hier sind die ersten paar Bytes:

FF FE 3C 00 68 00 74 00

Antworten:

12 für die Antwort № 1

Wenn Sie einfach "UTF-16" angeben, wird Perl verwendetSuchen Sie nach der Byte-Order-Marke (BOM), um herauszufinden, wie sie analysiert werden soll. Wenn es keine Stückliste gibt, wird es explodieren. In diesem Fall müssen Sie Encode mitteilen, welche Byte-Reihenfolge Sie haben, indem Sie entweder "UTF-16LE" für Little-Endian oder "UTF-16BE" für Groß- Endian.

Da ist noch etwas los mit IhremSituation zwar, aber es ist schwer zu sagen, ohne die Daten zu sehen, die Sie in der Datei haben. Ich erhalte die gleiche Fehlermeldung mit beiden Ausschnitten. Wenn ich keine Stückliste habe und keine Byte-Reihenfolge angreife, beschwert sich mein Perl Welches Perl verwenden Sie und welche Plattform haben Sie? Hat Ihre Plattform die native Endianness Ihrer Datei? Ich denke, das Verhalten, das ich sehe, ist gemäß den Dokumenten korrekt.

Sie können auch nicht einfach eine Zeile in einer unbekannten Kodierung lesen (was auch immer Perls Standardeinstellung ist) und diese dann an verschicken decode. Möglicherweise landen Sie mitten in einer Multibyte-Sequenz. Sie müssen verwenden Encode::FB_QUIET um den Teil des Puffers zu speichern, den Sie nicht dekodieren können, und den nächsten Datenblock hinzufügen

open my($lefh), "<:raw", "text-utf16.txt";

my $string;
while( $string .= <$lefh> ) {
print decode("UTF-16LE", $string, Encode::FB_QUIET)
}

5 für die Antwort № 2

Sie müssen entweder UTF-16BE oder UTF-16LE angeben. Sehen http://perldoc.perl.org/Encode/Unicode.html#Size%2c-Endianness%2c-and-BOM


1 für die Antwort № 3

Was Sie versuchen, unmöglich zu machen.

Du liest Linien von Text ohne Angabe einer Kodierung, so dass jedes Byte, das ein Zeilenvorschubzeichen enthält (Standardeinstellung) x0a) endet eine Zeile. Dieses Newline-Zeichen befindet sich jedoch möglicherweise mitten in einem UTF-16-Zeichen. In diesem Fall kann die nächste Zeile nicht dekodiert werden. Wenn es sich bei Ihren Daten um UTF-16LE handelt, werden dies alle Zeiteinteilungen sein x0a x00. Wenn Sie UTF16-BE haben, können Sie Glück haben (Zeilenumbrüche sind x00 x0a), bis Sie einen Charakter mit bekommen x0a im high byte.

Öffnen Sie die Datei also in der richtigen Kodierung.