wake-up-neo.com

Warum tut das PHP json_encode-Funktion konvertiert UTF-8-Zeichenfolgen in hexadezimale Entitäten?

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."
107
David Jones

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 );
249
John Severinson

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));
}
52
mpyw

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 );
2
Steffo Dimfelt

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.

1
gaba

Sie setzen gerne Zeichensatz und unicape Unicode

 header('Content-Type: application/json;charset=utf-8');  
 json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
1
Adrian Romero

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 ) );
}
0
abu
json_encode($text, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
0
Hoàng Vũ Tgtt