dedlfix: cp1252 zu UTF-8

Beitrag lesen

Tach!

Obwohl ich diese Funktion anscheinend nicht richtig verstehe, weil...

if(mb_detect_encoding($txt,'UTF-8')){echo 'UTF-8 kodiert';}

if(mb_detect_encoding($txt,'ISO-8859-1')){echo 'ISO-8859-1 kodiert';}

erhalte ich als Ergebnis: UTF-8 kodiert ISO-8859-1 kodiert Ja und beides kann doch nicht gleichzeitig richtig sein oder doch?

Man kann Kodierungen grundsätzlich nicht erkennen. Es gibt lediglich einige Indizien, anhand derer man eine Annahme zu einer Kodierung treffen kann. Bei UTF-8 geht das, wenn Zeichen oberhalb von ASCII im Text vorkommen. Die müssen in der korrekten Byte-Sequenz kodiert sein.

Die einfachen Test-Funktionen beschränken sich meist darauf, ungültige Bytesequentzen zu finden, um eine bestimmte Kodierung ausschließen zu können.

Bei ISO-8859-1 ist jedem Byte ein Zeichen zugeordnet. (Die Ausnahmen 00..1F und 80..9F ignorieren wir mal.) Und weil jeder Bytewert ein Zeichen ergibt, gibt es keine Bytefolge, die kein korrektes ISO-8859-1 wäre. Dasselbe trifft auf alle Ein-Byte-Kodierungen zu, die keine unbelegten Bereiche haben.

Ob das Ergebnis sinnvoll ist, kann kein simpler Algorithmus feststellen. Dazu braucht es Dinge wie eine lexikalische Analyse, ob die Zeichen aneinandergereiht Wörter ergeben. Ansonsten kann man nicht sicher sehen, ob die beiden Bytes C3 A4 ein UTF-8-ä oder die beiden Zeichen à und ¤ sein sollen.

Alles sehr verwirrend, diese ganzen Kodierungslabyrinthe. Selbst jeder Editor erkennt eine UTF-8 Datei ohne BOM als solche an, sobald auch nur ein Umlaut drin ist. Was mache ich falsch?

"sobald auch nur ein Umlaut drin ist" weil die eine ganz bestimmte Byte-Sequenz ergeben müssen, von der es eher unwahrscheinlich ist, dass die als ISO-8859-1 interpretiert, ein sinnvolles Ergebnis ist. Die Aussage kann man verallgemeinern zu allen Zeichen außerhalb von ASCII, beziehungsweise mit Unicode-Codepoint größer als 127.

dedlfix.