Werte in UTF-8 kodiert wird als NULL-Wert in JSON
Habe ich eine Reihe von keywords, die durchfahren werden über JSON aus der DB (codierte UTF-8), von denen einige möglicherweise Sonderzeichen wie é, è, ç, usw.. Dies ist als Teil eines auto-completer. Beispiel:
array('Coffee', 'Cappuccino', 'Café');
Sollte ich hinzufügen, dass das array, wie es kommt aus der DB wäre:
array('Coffee', 'Cappuccino', 'Café');
Aber JSON-kodiert als:
["coffee", "cappuccino", null];
Wenn ich drucken Sie diese per print_r(), zeigen Sie sich problemlos auf einem UTF-8-codierten Webseite, aber café kommt durch als "café" wenn "text/plain" wird verwendet, wenn ich will, zu betrachten Sie das array mit print_r($array);exit();.
Wenn ich encode mit utf8_encode() vor der Codierung zu JSON, kommt es durch Ordnung, aber was wird gedruckt, auf der Webseite ist "café" und nicht "café".
Auch seltsam, aber json_last_error() wird gesehen als eine Undefinierte Funktion, aber json_decode() und die Funktionen json_encode() funktionieren.
Irgendwelche Ideen auf, wie man UTF-8-kodierte Daten aus der Datenbank zu Verhalten, während des gesamten Prozesses?
EIDT: Hier ist die PHP-Funktion packt die Schlüsselwörter und stellt Sie in einem einzigen array:
private function get_keywords()
{
global $db, $json;
$output = array();
$db->query("SELECT keywords FROM listings");
while ($r = $db->get_array())
{
$split = explode(",", $r['keywords']);
foreach ($split as $s)
{
$s = trim($s);
if ($s != "" && !in_array($s, $output)) $output[] = strtolower($s);
}
}
$json->echo_json($output);
}
Json::echo_json Methode nur kodiert, legt die header und druckt es (für die Verwendung mit Prototyp)
EDIT: DB-Verbindungs-Methode:
function connect()
{
if ($this->set['sql_connect'])
{
$this->connection = @mysql_connect( $this->set['sql_host'], $this->set['sql_user'], $this->set['sql_pass'])
OR $this->debug( "Connection Error", mysql_errno() .": ". mysql_error());
$this->db = @mysql_select_db( $this->set['sql_name'], $this->connection)
OR $this->debug( "Database Error", "Cannot Select Database '". $this->set['sql_name'] ."'");
$this->is_connected = TRUE;
}
return TRUE;
}
Mehr Updates:
Einfaches PHP-script, das ich ran:
echo json_encode( array("Café") ); //["Caf\u00e9"]
echo json_encode( array("Café") ); //null
- json_last_error() wurde in 5.3.0 zu können, müssen Sie eine frühere version. So zumindest diese Fremdheit ist, erklärte jetzt 🙂
- Danke. Ich kam nur über diesen Fehler, wenn Sie versuchen, um herauszufinden, warum codierte Daten kodiert wird als NULL.
- Kann man den code für
echo_json
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund könnte sein, dass die aktuelle client-Zeichensatz einstellen. Eine einfache Lösung könnte sein, die Kunden mit
mysql_query('SET CHARACTER SET utf8')
vor dem ausführen des
SELECT
Abfrage.Update (Juni 2014)
Die mysql-extension ist deprecated seit PHP 5.5.0. Es wird jetzt empfohlen, mysqli verwendet. Auch bei der weiteren Lektüre - in der oben beschriebenen Weise der Einstellung der client sollte vermieden werden für Gründen, einschließlich der Sicherheit.
Ich habe es noch nicht getestet, aber dies sollte ein ok Ersatz:
oder mit der Verbindung parameter :
json_encode
zu sein scheint, fallen strings mit ungültigen Zeichen. Es ist wahrscheinlich, dass die UTF-8-Daten nicht ankommen, in der richtigen form aus Ihrer Datenbank.Blick auf die Beispiele, die Sie geben, meine wilde Vermutung wäre, dass die Datenbank Verbindung ist nicht UTF-8-kodiert und dient ISO-8859-1-Zeichen statt.
Können Sie versuchen, eine
SET NAMES utf8;
nach der Initialisierung der Verbindung?mysql_query("SET NAMES utf8", $this->connection);
vor der Rückkehrutf8_encode()
ing hier. Der Prozess, den Sie tun sollte ohne weitere Kodierung oder Dekodierung.Ich habe versucht das code Beispiel wie diese
Auf dieser Basis würde ich sagen, dass, wenn die Quelle die Daten wirklich UTF-8, dann die Funktionen json_encode funktioniert Prima. Wenn nicht, dann ist das, wo man null. Warum nicht, kann ich nicht sagen, die auf diesen Informationen basieren.
Versuchen, das senden Sie Ihre array über diese Funktion, bevor Sie die Funktionen json_encode():
Entnommen aus Kommentar auf phpnet @ http://php.net/manual/en/function.json-encode.php.
Die Funktion im Grunde Schleifen obwohl array-Elemente, vielleicht haben Sie Ihre utf-8-Codierung auf dem array selbst?
Meine Lösung zum konvertieren in utf8-Daten :