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.