wake-up-neo.com

Fehler: "Eingabe ist nicht korrekt UTF-8, Kodierung angeben!" mit simplexml_load_string von PHP

Ich erhalte den Fehler:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

Beim Versuch, eine XML-Antwort mit simplexml_load_string aus einer Drittanbieter-Quelle zu verarbeiten. Die unformatierte XML-Antwort gibt den Inhaltstyp an:

<?xml version="1.0" encoding="UTF-8"?>

Es scheint jedoch, dass das XML nicht wirklich UTF-8 ist. Die Sprache des XML-Inhalts ist Spanisch und enthält Wörter wie Dublín im XML.

Ich kann die Drittanbieter nicht dazu bringen, ihre XML-Dateien zu sortieren.

Wie kann ich das XML vorverarbeiten und die Inkompatibilitäten der Kodierung beheben?

Gibt es eine Möglichkeit, die korrekte Kodierung für eine XML-Datei zu ermitteln?

55
Camsoft

Ihre 0xED 0x6E 0x2C 0x20 Bytes entsprechen "ín" in ISO-8859-1, so dass es aussieht, als ob Ihr Inhalt in ISO-8859-1 und nicht in UTF-8 enthalten ist. Informieren Sie Ihren Datenprovider darüber und bitten Sie ihn, das Problem zu beheben. Wenn es für Sie nicht funktioniert, funktioniert es wahrscheinlich auch nicht für andere.

Nun gibt es einige Möglichkeiten, das Problem zu umgehen. Verwenden Sie nur wenn Sie das XML nicht normal laden können. Eine davon wäre utf8_encode(). Der Nachteil ist, dass das Ergebnis mojibake enthält, wenn dieses XML sowohl gültiges UTF-8 als auch einige ISO-8859-1 enthält. Sie können auch versuchen, die Zeichenfolge von UTF-8 nach UTF-8 mit iconv() oder mbstring zu konvertieren, und hoffen, dass die Zeichenfolge für Sie behoben wird. (Sie werden dies nicht tun, aber Sie können zumindest die ungültigen Zeichen ignorieren, damit Sie Ihr XML laden können.)

Oder Sie können den langen, langen Weg nehmen und die Sequenzen selbst validieren/fixieren. Das wird eine Weile dauern, je nachdem, wie vertraut Sie mit UTF-8 sind. Vielleicht gibt es Bibliotheken, die das tun würden, obwohl ich keine kenne.

Benachrichtigen Sie Ihren Datenanbieter auf jeden Fall, dass er ungültige Daten sendet, damit er sie beheben kann.


Hier ist eine teilweise Korrektur. Es wird definitiv nicht alles reparieren, aber es wird einiges behoben. Hoffentlich genug, damit Sie zurechtkommen, bis Ihr Provider ihre Sachen repariert.

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
{
    return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
}

function utf8_encode_callback($m)
{
    return utf8_encode($m[0]);
}
71
Josh Davis

Ich habe das mit gelöst

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
46
Erik

Wenn Sie sicher sind, dass Ihre XML-Datei in UTF-8 kodiert ist, aber schlechte Zeichen enthält, können Sie diese Funktion verwenden, um sie zu korrigieren:

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
11
befox

Wir sind kürzlich auf ein ähnliches Problem gestoßen und konnten nichts offensichtliches als Ursache finden. Es stellte sich heraus, dass Steuerzeichen in unserer Zeichenfolge enthalten war. Als wir diese Zeichenfolge jedoch im Browser ausgaben, war dieses Zeichen nicht sichtbar, es sei denn, der Text wurde in eine IDE kopiert.

Wir haben es geschafft, unser Problem dank diesem Beitrag und diesem zu lösen:

preg_replace ('/ [\ x00\x1F\x7F] /', '', $ input);

4
Paul Blundell

Anstatt Javascript zu verwenden, können Sie die folgende Codezeile nach dem Satz von mysql_connect einfügen:

mysql_set_charset('utf8',$connection);

Prost.

3
Chango

Können Sie die XML-Quelle eines Drittanbieters in Firefox öffnen und sehen, was als Kodierung automatisch erkannt wird? Vielleicht verwenden sie normales altes ISO-8859-1, UTF-16 oder etwas anderes. 

Wenn sie es jedoch als UTF-8 deklarieren und etwas anderes servieren, ist ihr Feed eindeutig defekt. Ein solches kaputtes Futter umzugehen fühlt sich fürchterlich an (auch wenn es manchmal unvermeidlich ist, weiß ich).

Wenn es sich um einen einfachen Fall wie "UTF-8 vs. ISO-8859-1" handelt, können Sie Ihr Glück auch mit mb_detect_encoding () versuchen.

2
Pekka 웃

Wenn Sie eine XML-Datei herunterladen und zum Beispiel in Notepad ++ öffnen, werden Sie feststellen, dass die Codierung auf etwas anderes als UTF8 gesetzt ist.

String <?xml version="1.0" encoding="UTF-8"?> legt nicht die Kodierung des Dokuments fest, es ist nur eine Information für den Validator oder eine andere Ressource.

2
skr

Nach mehreren Versuchen fand ich HTML-Funktionen Funktion funktioniert.

$value = htmlentities($value)
1
George John

Beim Erstellen von Zuordnungsdateien mit Doctrine bin ich auf dasselbe Problem gestoßen. Ich habe es behoben, indem ich alle Kommentare entfernt habe, die einige Felder in der Datenbank hatten. 

0
Tim Lieberman

Ich hatte gerade dieses Problem. Es stellte sich heraus, dass die XML-Datei (nicht der Inhalt) nicht in utf-8, sondern in ISO-8859-1 kodiert war. Sie können dies auf einem Mac mit file -I xml_filename überprüfen.

Ich habe Sublime verwendet, um die Dateikodierung in utf-8 zu ändern, und lxml importierte es ohne Probleme.

0
paragbaxi