Zeichensatzdetektor
Erstellt von Tobi am Montag 14. November 2005
Mal ein, zugegeben sehr unschöner und keinesfalls professioneller, Ansatz, den Zeichensatz eines Textes zu identifizieren
#!/usr/bin/perl
use strict;
use Unicode::MapUTF8 qw(to_utf8 from_utf8 utf8_supported_charset);
my $uuml = 'ü'; # Erwartetes Zeichen
my $code = 129; # Code des unbekannen Zeichensatzzeichens
my @character_sets = utf8_supported_charset; # List available character set encodings
my $char = chr($code);
foreach my $charset (@character_sets) {
my $utf8 = Unicode::MapUTF8::to_utf8({ -string => $char, -charset => $charset });
# from $charset
if (ord($uuml) == ord(Unicode::MapUTF8::from_utf8({ -string => $utf8, -charset => 'iso-8859-1' }))) {
warn $charset;
}
}
Es gibt aber schon Tools, die genau das leisten:
Charset-Detect via Java
Diverse Tools für Perl
Ein Problem gibt es noch mit dem automatischen Abschneiden von Inhalten. Versucht man, einen UTF-8 String auf eine konkrete Länge zu kürzen, kann es passieren, dass man ein 2-Byte-Zeichen genau in der Mitte teild. Ergebniss ist im günstigsten Fall dann ein unschönes Viereck am Ende des Strings, im schlechtesten fall ein Steuerzeichen, dass weitere Inhalte verschwinden lässt. Hierfür bietet der Quellcode von Lingua::DetectCharset da immerhin ein paar Ansätze.
Es gibt einen neuen Ansatz für einen Detektor für Zeichensätze. Mal sehen, was das ergibt.

Donnerstag 12. Juli 2007 um 09:13
Hast du schon eine Lösung für dieses Problem gefunden?
Sonntag 15. Juli 2007 um 17:17
Es gibt da leider immer noch keine wirklich 100%tige Lösung. Einzig Encode::Guess liefert einen recht sicheren Ansatz zur Lösungsfindung. Allerdings ist die Schnittstelle des Modules recht … wie soll ich sagen … gewöhnungsbedürftig. Findet es einen konkreten Zeichensatz, bekommt man das Objekt. Gibt es mehrere Möglichkeiten, bekommt man einen String ala “iso-8859-1 or iso-8859-15 or…” zurück. Argl!
Ansonsten hab ich von nichts besserem gehört. Die PerlMonks wussten auch nicht mehr-> siehe http://perlmonks.org/?node_id=611577