Leser: 21
Quotepâté
2009-05-30T16:45:29 leo11[...]
file -ik zeigt mir an, dass die Konvertierung funktioniert hat. In der Datei steht sonst nichts. Also kein Header mit einer Zeichensatzangabe wie in Http-Headern. Wie wurde dann der Zeichensatz erkannt?
[...]
Quote[...]
Nehmen wir mal an ich hätte file -ik nicht zur Verfügung und müsste mir den verwendeten Zeichensatz herleiten. Wie kann ich das machen?
[...]
Quote[...]
Schau ich mir nun die Datei utf8.txt mit vi, jedit, kate oder khexedit an erscheint der String pâté. [...] Wieso haben die Programme das nicht selbstständig erkannt?
[...]
Quote[...]
In welchem Zusammenhang stehen Unicode, UTF-8, UTF-16, ISO-8859-1?
[...]
Quote[...]
Kann man eine Datei in der steht charset: UTF-8 auf korrektes UTF-8 prüfen?
[...]
2009-05-30T20:51:35 murphyWenn Du eine ähnliche Art von Zeichensatzerkennung in Perl machen möchtest, gibt es dafür das Modul Encode::Guess.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; use Encode; use Encode::Guess; my $data='pâté'; #my $data='pate'; 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 = $enc->decode($data); # or my $utf8 = decode($enc->name, $data); print $utf8,"\n\n";
2009-05-31T07:41:23 leo11[...]
Code (perl): (dl )1 2 3 4my $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);
[...]
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.
[...]
Quote[...]
Wie kann ich mir eine Liste der unterstützen Zeichensätze ausgeben lassen? So etwas wie iconv --list.
[...]
perl -MEncode -le 'print for (Encode->encodings(":all"));'
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.
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 }'