Ich habe ein PHP Skript, das sich mit einer Vielzahl von Sprachen befasst. Jedes Mal, wenn ich versuche, json_encode
zu verwenden, werden alle Unicode-Ausgaben in hexadezimale Entitäten konvertiert. Ist das das erwartete Verhalten? Gibt es eine Möglichkeit, die Ausgabe in UTF-8-Zeichen umzuwandeln?
Hier ist ein Beispiel von dem, was ich sehe:
EINGANG
echo $text;
AUSGABE
База данни грешка.
EINGANG
json_encode($text);
AUSGABE
"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430."
Seit PHP/5.4.0 gibt es eine Option namens "JSON_UNESCAPED_UNICODE"
. Hör zu:
http://se2.php.net/json_encode
Deshalb sollten Sie versuchen:
json_encode( $text, JSON_UNESCAPED_UNICODE );
JSON_UNESCAPED_UNICODE ist ab PHP Version 5.4 oder höher verfügbar.
Der folgende Code ist für Version 5.3.
AKTUALISIERTE
html_entity_decode
ist etwas effizienter als pack
+ mb_convert_encoding
.(*SKIP)(*FAIL)
überspringt sich selbst und angegebene Zeichen mit JSON_HEX_*
-Flags.function raw_json_encode($input, $flags = 0) {
$fails = implode('|', array_filter(array(
'\\\\',
$flags & JSON_HEX_TAG ? 'u003[CE]' : '',
$flags & JSON_HEX_AMP ? 'u0026' : '',
$flags & JSON_HEX_APOS ? 'u0027' : '',
$flags & JSON_HEX_QUOT ? 'u0022' : '',
)));
$pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
$callback = function ($m) {
return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
};
return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}
Eine Lösung besteht darin, Daten zunächst zu codieren und dann in derselben Datei zu decodieren:
$string =json_encode($input, JSON_UNESCAPED_UNICODE) ;
echo $decoded = html_entity_decode( $string );
Hier ist meine kombinierte Lösung für verschiedene PHP Versionen.
In meiner Firma arbeiten wir mit verschiedenen Servern mit verschiedenen PHP Versionen, daher musste ich eine Lösung finden, die für alle funktioniert.
$phpVersion = substr(phpversion(), 0, 3)*1;
if($phpVersion >= 5.4) {
$encodedValue = json_encode($value, JSON_UNESCAPED_UNICODE);
} else {
$encodedValue = preg_replace('/\\\\u([a-f0-9]{4})/e', "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($value));
}
Credits sollten an Marco Gasi & abu gehen. Die Lösung für PHP> = 5.4 finden Sie in den json_encode-Dokumenten.
Sie setzen gerne Zeichensatz und unicape Unicode
header('Content-Type: application/json;charset=utf-8');
json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
Die Funktion raw_json_encode () oben hat das Problem nicht gelöst (aus irgendeinem Grund hat die Callback-Funktion einen Fehler auf meinem PHP 5.2.5-Server ausgelöst).
Aber diese andere Lösung hat tatsächlich funktioniert.
https://www.experts-exchange.com/questions/28628085/json-encode-fails-mit-special-characters.html
Credits sollten an Marco Gasi gehen. Ich rufe einfach seine Funktion auf, anstatt json_encode () aufzurufen:
function jsonRemoveUnicodeSequences( $json_struct )
{
return preg_replace( "/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode( $json_struct ) );
}
json_encode($text, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);