cURL bekommt Antwort mit utf-8-BOM
In meinem script, das ich Daten senden mit cURL und aktiviert CURLOPT_RETURNTRANSFER. Die Antwort ist json-codierte Daten. Wenn ich versuche, json_decode, gibt Sie null zurück. Dann fand ich, dass die Antwort enthält die utf-8 BOM-Zeichen am Anfang der Zeichenfolge ().
Gibt es einige Experimente:
$data = $data = curl_exec($ch);
echo $data;
das Ergebnis ist
{"field_1":"text_1","feld_2":"text_2","field_3":"text_3"}
$data = $data = curl_exec($ch);
echo mb_detect_encoding($data);
Ergebnis - UTF-8
$data = $data = curl_exec($ch);
echo mb_convert_encoding($data, 'UTF-8', mb_detect_encoding($data));
//identical to echo mb_convert_encoding($data, 'UTF-8', 'UTF-8');
Ergebnis - {"field_1":"text_1","feld_2":"text_2","field_3":"text_3"}
Das einzige, was hilft, ist das entfernen der ersten 3 Symbole:
if (substr($data, 0, 3) == pack('CCC', 239, 187, 191)) {
$data = substr($data, 3);
}
Aber was, wenn es wieder eine Stückliste? Die Frage ist also:
Wie zu erkennen, rechts Codierung von cURL Antwort? ODER wie, um zu erkennen, was BOM hat arrrived? Oder vielleicht wie konvertiert man die Antwort mit Stückliste?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fürchte ich, dass Sie schon die Antwort gefunden, indem Sie sich - es ist eine schlechte Nachricht, dass es keine bessere Antwort, die ich kenne.
Stückliste nicht dort sein sollte, und es ist der VERSENDER verantwortlich, dass nicht senden Sie es zusammen.
Aber ich kann Sie beruhigen, der BOM ist da, oder es ist nicht, und wenn es ist, sind es diese drei bytes, die Sie kennen.
Können Sie etwas schneller und Griff ein weiteres N-Stücklisten mit einer kleinen änderung:
Einem Drittanbieter-BOM-Detektor nicht anders. Auf diese Weise sind Sie sogar gedeckt, wenn zu einem späteren Zeitpunkt cURL begann Strippen nicht benötigte Stücklisten.
Mögliche Ursachen
Einige JSON-Optimierer und Filter kann beschließen, die Ausgabe erfordert eine Stückliste. Auch, vielleicht einfach, wer schrieb das Skript für die Generierung der JSON-versehentlich enthalten eine Stückliste, bevor Sie die öffnung PHP-tag. Apache, nicht die Sorge, was das BOM ist, sieht es Daten, die vor der Eröffnung tag, so sendet es zusammen und versteckt es aus dem PHP-stream selbst. Dies kann gelegentlich auch dazu führen, das "Cannot add Header: Ausgabe bereits begonnen" Fehler.
- Inhalte Nachweis
Überprüfen Sie den JSON ist gültig UTF-8, BOM oder nicht BOM, müssen aber
mb_string
Unterstützung und müssen Sie den strikten Modus, um einige Grenzfälle:Ich würde raten, gegen versuchen, zu korrigieren eine mögliche Codierung Fehler, riskieren Sie, brechen Sie Ihren eigenen code, und auch für die Pflege jemand anderes Arbeit.
Dieser Seite details, die ein ähnliches Problem: Stückliste in eine PHP-Seite automatisch generiert durch WordPress
Grundsätzlich kann auftreten, wenn die JSON-generator in PHP geschrieben ist und einen editor hat irgendwie schlich sich in die Stückliste vor der Eröffnung
<?php
tag. Da deine client Sprache ist PHP ich gehe davon aus das relevant ist.Könnten Sie Streifen es aus mit der
substr
Vergleich -- eine Stückliste nur Auftritt immer am Anfang eines Dokuments. Aber wenn Sie haben die Kontrolle über die JSON-Quelle, sollten Sie entfernen Sie die Stückliste aus dem Quelldokument statt.Es wird nie mehr als 3 Zeichen vor dem "{". Diese 3 Zeichen sind ein Zeichen in UTF-8. Also, wenn Sie gerade tun, $Daten = substr($data, 3); Sie werden in Ordnung sein.
Nehmen Sie einen Blick hier für mehr Informationen: json_decode NULL zurück nach webservice-Aufruf