192 votes

Pourquoi la fonction PHP json_encode convertit-elle les chaînes UTF-8 en entités hexadécimales ?

J'ai un script PHP qui traite une grande variété de langues. Malheureusement, chaque fois que j'essaie d'utiliser json_encode Si l'on utilise la méthode de l'arbre, toute sortie Unicode est convertie en entités hexadécimales. Est-ce le comportement attendu ? Existe-t-il un moyen de convertir la sortie en caractères UTF-8 ?

Voici un exemple de ce que je vois :

INPUT

echo $text;

SORTIE

  .

INPUT

json_encode($text);

SORTIE

"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430."

447voto

John Severinson Points 3205

Depuis PHP/5.4.0, il existe une option appelée JSON_UNESCAPED_UNICODE . Vérifiez :

https://php.net/function.json-encode

Vous devriez donc essayer :

json_encode( $text, JSON_UNESCAPED_UNICODE );

61voto

CertaiN Points 1372

JSON_UNESCAPED_UNICODE est disponible à partir de la version 5.4 de PHP.
Le code suivant concerne la version 5.3.

MISE À JOUR

  • html_entity_decode est un peu plus efficace que pack + mb_convert_encoding .
  • (*SKIP)(*FAIL) saute les barres obliques inversées elles-mêmes et les caractères spécifiés par JSON_HEX_* drapeaux.

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

13voto

Adrian R Points 28

Vous aimez définir le jeu de caractères et le code non encodé.

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

6voto

Steffo Dimfelt Points 353

Une solution consiste à coder d'abord les données puis à les décoder dans le même fichier :

$string =json_encode($input, JSON_UNESCAPED_UNICODE) ; 
echo $decoded = html_entity_decode( $string );

2voto

gaba Points 29

Voici ma solution combinée pour différentes versions de PHP.

Dans mon entreprise, nous travaillons sur différents serveurs avec diverses versions de PHP. J'ai donc dû trouver une solution qui fonctionne pour tous.

$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));
}

Les crédits doivent aller à Marco Gasi & abu . La solution pour PHP >= 5.4 est fournie dans la documentation de json_encode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X