Thread Encoding (4 answers)
Opened by leo11 at 2009-05-30 18:45

murphy
 2009-05-31 18:28
#122171 #122171
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
2009-05-31T07:41:23 leo11
[...]
Code (perl): (dl )
1
2
3
4
my $enc = guess_encoding($data, qw/ascii utf8 utf16 iso-8859-1/);
ref($enc) or die "Can't guess: $enc"; # trap error this way
[...]
my $utf8 = decode($enc->name, $data);

[...]

Bereits ohne Blick in die Dokumentation fällt mir auf, dass $enc hier im Erfolgsfall ganz offensichtlich ein Objekt enthält, das die erratene Kodierung beschreibt, und dass man den Namen dieser Kodierung wohl über die Methode name des besagten Objektes abrufen kann.

Quote
[...]
Das Bsp. bringt mir den Fehler:
UTF-16:Unrecognised BOM 70e2 at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/Encode/Guess.pm line 135.

Lass ich utf16 weg geht es.
[...]

Das ist allerdings doof. Es könnte fast sein, dass Du da auf einen Bug in Encode::Guess gestoßen bist, denn beim Erraten der Kodierung sollte eigentlich nicht einfach ein Fehler erzeugt werden.

Quote
[...]
Wie kann ich mir eine Liste der unterstützen Zeichensätze ausgeben lassen? So etwas wie iconv --list.
[...]

Ein kurzer Blick in die Dokumentation fördert zu Tage, dass man mit der Methode encodings der Klasse Encode eine Liste aller unterstützten Kodierungen abrufen können müsste. Und in der Tat produziert der Befehl
Code: (dl )
perl -MEncode -le 'print for (Encode->encodings(":all"));'
bei mir auf der Kommandozeile eine lange Liste mit Namen von Zeichensätzen.

Quote
[...]
Mein Ziel ist ein Oneliner der mir die Kodierung eines Files angibt wie es file -ik tut. Optimal wäre, wenn er auch bei XML-Dateien geht.

Ich habe etwas herumgespielt und komme zu dem Schluss, dass Encode::Guess mit langen Listen möglicher zu ratender Kodierungen nicht gerade sehr zuverlässig funktioniert. Allerdings kann dir folgender Einzeiler, der versucht den Zeichensatz über STDIN verfütterter Daten zu erraten, vielleicht als Ausgangspunkt dienen:
Code: (dl )
perl -MEncode -MEncode::Guess -le 'my $enc = guess_encoding(<STDIN>, grep !m/^UTF-(?:16|32).*(?![BL]E)$/i, Encode->encodings(":all")); if (ref $enc) { print $enc->name } else { exit 1 }'
When C++ is your hammer, every problem looks like your thumb.

View full thread Encoding