Thomas Mell: Korrekte Zeichensatzkodierung ermitteln

Beitrag lesen

Hallo,

Verzeihung übrigens, dass ich damals auf deine Mail nicht geantwortet hatte

Kein Problem, bin eh noch nicht zum coden gekommen.

Du kannst mir den aktuell gebrauchten Algorithmus aber gerne noch einmal zuschicken, falls dich meine Meinung noch interessiert.

"Gebraucht" wird noch kein Algorithmus, es war nur ein Entwurf wie dieser mal arbeiten soll.
Aber irgendwie komme ich nicht so richtig von der Stelle; um so tiefer ich mich in die Materie einarbeite, desto Widersprüchlicher, Unverständlicher und Sinnloser wird das ganze W3C-Sammelsurium.
Da ich Validome nicht noch mal umcoden möchte, will ich es jetzt einmal richtig machen und dann Ruhe haben ;-))
Deshalb muss ich erst mal feststellen was Vorschrift ist, was Empfehlungen sind und was man dem gesunden Menschenverstand überlässt; und dann den ganzen Plunder unter ein Dach zu bringen. Leider gibt es kaum Menschen die sich in der Materie halbwegs auskennen (Du bist da wohl ne Ausnahme ;-)), so das ich mir fast alles selber aneignen muss.
Wenn ich mal alle Infos zusammenfasse komme ich zu diesem vorläufigen Ergebnis:
Zunächst wird der HTTP-Header und der BOM ermittelt und anschließend wird versucht anhand des binären Musters von <?xml......> UTF-16 oder UTF-32 zu ermitteln und den Charset der XML-Deklaration festzustellen.
Gibt es einen (oder mehrerer) Konflikt(e) zwischen BOM/auto/XML, gibt's einen Fatal Error.
Ein Konflikt zwischen HTTP-Header und BOM/auto/XML (welche in sich nun Konfliktfrei sind) erzeugt nur eine Warnung, da in der Praxis wohl häufig anzutreffen ist.
Sollte keiner dieser Angaben vorhanden sein, kann jedoch noch kein Fehler erzeugt werden (fehlende Zeichensatzkodierung), da es sich um ein HTML-Dokument mit Meta-Tag handeln könnte.
Um das Meta-Tag überhaupt finden zu können, bräuchte ich aber den benutzten Zeichensatz des Dokumentes. Das dürfte z.B. bei UTF-16 ohne BOM schwierig werden (bei X[HT]ML ist dies anhand des Musters für <?xml....> einfach).
Hier könnt man z.B. nach dem Muster von <html und <body suchen (einer von beiden muss vorhanden sein). Sollte auch diese Suche fruchtlos sein gibt's ne Fehlermeldung das keine Zeichensatzangabe gefunden wurde.
Wurde ein Muster gefunden, wird zunächst nach der Dokumententypdeklaration gesucht (natürlich auch wenn der Zeichensatz zuvor ermittelt werden konnte) um festzustellen ob es sich um ein HTML oder XHTML-Dokument handelt.
Bei HTML wird nun nach dem Meta-Tag gesucht. Einen Fatal Error gibt es bei Konflikten zwischen Meta und BOM/auto oder wenn zuvor eine XML-Deklaration gefunden wurde.
Ein Konflikt zwischen Meta und HTTP-Header ergibt dagegen nur eine Warnung.
Die Prioritätenreihenfolge der Zeichensatzangaben währen bei HTML wie folgt:
1. HTTP-Header
2. BOM/auto
3. Automatische Erkennung anhand von <html und <body
4. Meta-Tag
Weiterhin wird prinzipiell eine Warnung (Hinweis?) ausgegeben wenn die Zeichensatzkodierung nur anhand des HTTP-Headers oder der Suche nach <html und <body ermittelt werden konnte.

Bei XML und XHTML:
1. HTTP-Header
2. BOM/auto/XML

Einen Fallback gibt es prinzipiell nicht.
Was meinst Du, könnte man den Algorithmus so bauen?
Ein Flussdiagramm werde ich jetzt noch anlegen, wenn Du möchtest schicke ich es Dir gerne zu.

Grüße
Thomas