Leider werden nicht alle Dateien so ausgeliefert, wie es angegeben wird.
Das Problem tritt vor allem auf, wenn man wie ich, viel mit XML-Datenfeeds aus unterschiedlicher Quelle arbeitet.
Am Ende soll eine wohlgeformte und lesbare Datei herauskommen, daher muss man die Eingabedatei anhand ihres Formats eventuell konvertiert.
Da gibt es einerseits die Möglichkeit in PHP mit den eingebauten Funktionen mb_check_encoding() oder mb_detect_encoding() zu arbeiten, bevor man dann mit utf8_decode() oder utf8_encode() weiterarbeitet.
Mein ehrlicher Tipp an euch: die obigen Funktionen sind Mist und liefern nicht das Resultat, auf das ihr euch verlassen wollt.
Deswegen rate ich euch, nehmt die Funktion und checkt “händisch” welches Format reinkommt.
function check_utf8($str) {
$len = strlen($str);
for($i = 0; $i < $len; $i++){
$c = ord($str[$i]);
if ($c > 128) {
if (($c > 247)) return false;
elseif ($c > 239) $bytes = 4;
elseif ($c > 223) $bytes = 3;
elseif ($c > 191) $bytes = 2;
else return false;
if (($i + $bytes) > $len) return false;
while ($bytes > 1) {
$i++;
$b = ord($str[$i]);
if ($b < 128 || $b > 191) return false;
$bytes--;
}
}
}
return true;
}
Zum Beispiel mit:
if(check_utf8(utf8_decode($str))) $xml = simplexml_load_string(utf8_decode($str));
else if(check_utf8($str)) $xml = simplexml_load_string($str);
Damit bekommt ihr sicher einen UTF-8-String mit dem Dateiinhalt zurückgeliefert.
Achja, simplexml_load_string() bzw. simplexml_load_file() haben einen Bug, sodass immer nur UTF-8 nach dem Einlesen zurückgegeben wird, daher checkt das am besten vorher wie oben aufgeführt nochmal ab.
Viel Spaß damit!