UTF-8 Codierung erkennen
Tom
- php
0 Tom0 Sven Rautenberg0 Tom0 Sven Rautenberg0 Tom
1 dedlfix
1 Gunnar Bittersmann0 Cybaer
Hello,
gibt es eigentlich eine einigermaßen verlässliche Möglichkeit zu erkennen, ob ein Text in utf8 oder anders codiert ist? ISO8859-x darf ja wahrscheinlich alle Bytefolgen enthalten, aber bei utf-8 müsste es doch da ganz bestimmte Lücken geben, oder?
Es würde mir schon reichen, wenn ich erkennen könnte, dass ein Text garantiert nicht fehlerfrei in utf8 codiert ist.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hello,
Der erxte Aspekt der Frage hat sich schon erledigt. Eine Funktion habe ich doch noch gefunden unter
http://www.php.net/manual/de/function.mb-detect-encoding.php
Der zeite Aspekt der Frage bleibt aber bestehen: wie funktioniert es?
Wo sind erkennbare Zeichen/Lücken/Folgen/usw., um das Ganze abzusichern?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Moin!
Der erxte Aspekt der Frage hat sich schon erledigt. Eine Funktion habe ich doch noch gefunden unter
http://www.php.net/manual/de/function.mb-detect-encoding.phpDer zeite Aspekt der Frage bleibt aber bestehen: wie funktioniert es?
Wo sind erkennbare Zeichen/Lücken/Folgen/usw., um das Ganze abzusichern?
Es gibt keine Möglichkeit, einfach eine Bytefolge zu untersuchen, um daraus mit 100% Garantie das exakt verwendete Encoding zu ermitteln.
Man kann Ausschlußverfahren anwenden: Wenn eine Bytefolge nicht in ein Codierschema paßt, weil Bytes oder Kombinationen von Bytes vorkommen, die es dort nicht gibt, dann kann es das Schema nicht sein - aber noch jedes andere.
Eventuell ließen sich auch statistische Maßnahmen anwenden, die den Inhalt analysieren und mit Wahrscheinlichkeiten operieren - das ist dann aber von "Sicherheit" weit entfernt.
Problematisch ist insbesondere, wenn Codierungen zu großen Teilen identisch sind, und nur die Details unterschiedlich, wie beispielsweise ISO-8859-1, Windows-1252 und ISO-8859-15. Solange nur Zeichen vorkommen, die in allen Codierungen gleich sind, ist es egal, welche Codierung festgestellt wird - spannend wird es, wenn Zeichen vorkommen, die als Bytewert in allen Schemata definiert sind, aber jeweils eine unterschiedliche Bedeutung haben.
Als klassisches Beispiel sei nur auf das Eurozeichen verwiesen: In ISO-8859-1 existiert es nicht, der Bytewert fürs Euro codiert dort das allgemeine Währungssymbol ¤.
Es ist deshalb unerläßlich, die Codierung immer explizit mit anzugeben, um Probleme beim Wiedereinlesen auszuschließen.
- Sven Rautenberg
Hello Gunnar, Dedlfix, Sven,
Man kann Ausschlußverfahren anwenden: Wenn eine Bytefolge nicht in ein Codierschema paßt, weil Bytes oder Kombinationen von Bytes vorkommen, die es dort nicht gibt, dann kann es das Schema nicht sein - aber noch jedes andere.
Eventuell ließen sich auch statistische Maßnahmen anwenden, die den Inhalt analysieren und mit Wahrscheinlichkeiten operieren - das ist dann aber von "Sicherheit" weit entfernt.
Es geht um Texte, deren Codierung leider nicht immer geklärt ist.
Man müsste also mehrere Passagen daraus ausschneiden und diese einzeln prüfen.
Wie müsste ich denn schneiden? Ist das Zeilenende-Zeichen in allen üblichen Codierungen (im Prinzip sind es nur ISO8859-X, UTF-8, Windows 1252, ASCII+ CP-437, ASCII+ CP-850) identisch entweder "\r\n" oder "\n" oder "\r" ?
In den Ein-Byte-Codes dürfte es ja eigentlich keine Schwierigkeiten geben und bei UTF-8 kann es bei längeren Sequenzen ja auch nicht in der Sequenz vorkommen. Oder habe ich was übersehen?
Man könnte also "Zeilen" in den Codierungen erkennen?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Moin!
Es geht um Texte, deren Codierung leider nicht immer geklärt ist.
Man müsste also mehrere Passagen daraus ausschneiden und diese einzeln prüfen.
Eher nicht.
Wie müsste ich denn schneiden? Ist das Zeilenende-Zeichen in allen üblichen Codierungen (im Prinzip sind es nur ISO8859-X, UTF-8, Windows 1252, ASCII+ CP-437, ASCII+ CP-850) identisch entweder "\r\n" oder "\n" oder "\r" ?
Da du dir Codetabellen aller genannten bzw. zu prüfenden Codierungen besorgen mußt, kannst du dir diese Frage ja selbst beantworten.
- Sven Rautenberg
Hello,
Wie müsste ich denn schneiden? Ist das Zeilenende-Zeichen in allen üblichen Codierungen (im Prinzip sind es nur ISO8859-X, UTF-8, Windows 1252, ASCII+ CP-437, ASCII+ CP-850) identisch entweder "\r\n" oder "\n" oder "\r" ?
Da du dir Codetabellen aller genannten bzw. zu prüfenden Codierungen besorgen mußt, kannst du dir diese Frage ja selbst beantworten.
Meine Frage ist ja uch nicht, was ich selber sehen kann, sondern was ich tunlichst nicht übersehen sollte :-)
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
echo $begrüßung;
Der erxte Aspekt der Frage hat sich schon erledigt. Eine Funktion habe ich doch noch gefunden unter
http://www.php.net/manual/de/function.mb-detect-encoding.php
Auch diese Funktion wird an folgendem Beispiel scheitern, das du dir ISO-8859-1-kodiert vorstellen musst:
Das scharfe s ist als UTF8 kodiert und als ISO-8859-1 angezeigt als ß zu sehen.
Der Text ist gültiges UTF-8, entspricht aber nur dann der Intention des Autor, wenn er als ISO-8859-1 interpretiert wird.
echo "$verabschiedung $name";
@@Tom:
gibt es eigentlich eine einigermaßen verlässliche Möglichkeit zu erkennen, ob ein Text in utf8 oder anders codiert ist?
Ein regulärer Ausdruck dafür ist zu finden in [QA-FORMS-UTF-8].
Live long and prosper,
Gunnar
Hi,
Es würde mir schon reichen, wenn ich erkennen könnte, dass ein Text garantiert nicht fehlerfrei in utf8 codiert ist.
Gruß, Cybaer
Hello,
Es würde mir schon reichen, wenn ich erkennen könnte, dass ein Text garantiert nicht fehlerfrei in utf8 codiert ist.
Danke, diese Funktion hatte sie ja sogar schon gebunkert, nur leider falsch einsoriert.
Nun habe ich sie wiedergefunden und gleich noch zwei interesante Funkionen dabei, die ich sonst heute hätte neu schreiben müssen ;-)
Ordnung ist das halbe Leben und die andere Hälfte beschäftigt man sich mit suchen.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi Tom!
Danke, diese Funktion hatte sie ja sogar schon gebunkert, nur leider falsch einsoriert.
Die hättest du aber auch in den Userkommentaren auf der von die verlinkten Seite zur Funktion mb_detect_encoding gefunden.
Ich hätte dir das schon vorher geschrieben, wenn ich gewusst hätte, dass du dir die Kommentare nicht durchgelesen hättest. =)
MfG H☼psel
Hi,
Die hättest du aber auch in den Userkommentaren auf der von die verlinkten Seite zur Funktion mb_detect_encoding gefunden.
Nein, die Funktion ist ein wenig anders. Aufgrund des Rückgabewerts kann man u.a. feststellen, ob es sich bei dem UTF-8-Text nicht um einen einfachen ANSI-Text handelt.
Gruß, Cybaer