dedlfix: mb_detect_encoding?

Beitrag lesen

Tach!

In solchen Fäll wirkt, trotz aller Unsicherheiten, die Spekulation mit mb_detect_encoding recht nützlich:

$coding = mb_detect_encoding($txt, 'ASCII, 'Windows-1252', 'ISO-8859-15', 'UTF-8'); # eventuell erweitern...

if ( ! 'UTF-8' == $coding ) { $txt=iconv($coding, 'UTF-8', $txt); }


> Leben, Frau, Gesundheit würde ich dem allerdings nicht anvertrauen....  
  
Vor allem (mal abgesehen von der falschen Syntax) nicht bei dieser Reihenfolge der Kodierungen.  
  
ASCII wird als Ergebnis ausgegeben, wenn kein Wert > 0x7F im Test-String enthalten ist. Soweit so richtig. Jetzt muss aber UTF-8 kommen, denn alle UTF-8-Sequenzen sind auch gültiges Windows-1252 oder ISO-8859-irgendwas. Wenn diese Ein-Byte-Kodierungen vor den Mehrbyte-Kodierungen stehen, werden sie in den meisten Fällen als gültig erkannt und als Ergebnis zurückgeliefert.  
  
~~~php
var_dump(mb_detect_encoding("ä", 'ascii,iso-8859-1,utf-8'));  
var_dump(mb_detect_encoding("ä", 'ascii,utf-8,iso-8859-1'));

Unter der Voraussetzung, dass das 'ä' UTF-8-kodiert ist, ist der Ergebnis der beiden Zeilen ISO-8859-1 und UTF-8. UTF-8 muss den ISOs stehen, damit es erkannt werden kann.

In ISO-8859-1 ist der Bereich \x7F bis \x9F undefiniert, mit keinen Zeichen belegt. Siehe dazu Wikipedia ISO-8859-1. Es gibt eine Variante, in der diese Lücke mit Steuerzeichen gefüllt ist. Auf alle Fälle ist aber in Windows-1252 dieser Bereich mit "richtigen Zeichen" gefüllt.

var_dump(mb_detect_encoding("\x83", 'windows-1252,iso-8859-1'));  
var_dump(mb_detect_encoding("\x83", 'iso-8859-1,windows-1252'));

mb_detect_encoding() ist aber nicht in der Lage, da Unterschiede zu sehen. Es ist also völlig egal, in welcher Reihenfolge man diese beiden Kodierungen angibt, die erste gewinnt immer. Bei Ein-Byte-Kodierungen kann weder diese Funktion die richtige Kodierung erkennen, noch irgendein anderer Mechanismus, der keine Inhaltsanalyse auf Plausibilität des Textes vornimmt. Google kann sowas, die haben aber auch einen riesigen Datenbestand, den sie zurate ziehen können.

Dass die Reihenfolge der zu testenden Kodierungen relevant ist, war in diesem Thread eigentlich bereits geklärt. Man muss es nochmal mit aller Deutlichkeit sagen: Diese Funktion gibt allein anhand der Gültigkeit der Bytesequenzen das erstbeste passende Kodierungsangabe zurück. Und zwar völlig unabhängig davon, ob der Text derart dekodiert den urspünglichen Text ergibt oder nicht. Um beim Wetten um "Leben, Frau und Gesundheit" überhaupt eine realistische Chance auf den Gewinn zu haben, muss man sich schon mit Kodierungen und den technischen (Un)Möglichkeiten ihrer Erkennung vertraut gemacht haben.

Generell kann man sagen, dass eine Dekodierung von beliebigen Daten - sei es Text oder "richtig" verschlüsselte Daten - unmöglich ist, wenn man nicht weiß, welche Kodierungsvorschrift verwendet wurde. Das ist schließlich das Grundprinzip einer Kodierung. Es gibt zwar diverse Vorgehensweisen, um an die ursprünglichen Daten zu kommen, aber keine davon kann eine 100%-Erfolgsgarantie geben, auch wenn man mit der einen oder anderen eine ausreichende Genauigkeit für den einen oder anderen Anwendungsfall erzielen kann.

dedlfix.