web-dev-qa-db-fra.com

Comment json_encode tableau avec des accents français?

J'ai un élément de tableau avec un accent français ([WIPDescription] => Recette Soupe à l'Oignon Sans Boeuf US). Les données sont correctement extraites de la base de données (mysql). 

Cependant, lorsque j'essaie de le coder en tant que JSON à l'aide du php intégré dans json_encode, il génère une valeur JSON nulle (serveur OS X: php 5.3.4, JSON activé 1.2.1). 

Sur un serveur Linux, la description est coupée après le premier caractère d’accent. 

J'ai essayé toutes les options json_encode sans succès. Aucune suggestion?

Je vous remercie.

22
Natkeeran

json_encode veut seulement utf-8. Selon votre jeu de caractères, vous pouvez utiliser iconv ou utf8_encodeavant appelant json_encode sur votre variable. Probablement avec array_walk_recursive.

Comme demandé, un moyen unfinished pour modifier un tableau, en supposant que (1) il ne contient pas d'objets et (2) les clés de tableau sont en ASCII/bornes inférieures, donc peuvent être laissées telles quelles:

$current_charset = 'ISO-8859-15';//or what it is now
array_walk_recursive($array,function(&$value) use ($current_charset){
     $value = iconv('UTF-8//TRANSLIT',$current_charset,$value);

});
16
Wrikken

J'ai trouvé que c'était le moyen le plus facile d'y faire face

echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

JSON_PRETTY_PRINT - rend lisible
JSON_UNESCAPED_UNICODE - code les caractères correctement
JSON_UNESCAPED_SLASHES - se débarrasse de la barre oblique d'échappement '\'
remarque également que ces options sont séparées par un tuyau '|'

27
Pete

Une autre solution serait d’utiliser htmlentities ou utf8_encode avant d’utiliser json_encode pour transmettre le caractère codé.

comme ça:

   $array = array('myvalue' => utf8_encode('ééàà'));
   return json_encode($array);

Ou en utilisant htmlentities

   $array = array('myvalue' => htmlentities('ééàà'));
   return json_encode($array);
9
sdespont
<? 

$sql=mysql_query("SELECT * FROM TABLE...");

while($row=mysql_fetch_array($sql))
{
    $output[]=array_map("utf8_encode", $row);
}
print(json_encode($output));
mysql_close();

?>
4
Mike Bryant
$json = utf8_encode($string);

$json = json_decode($json);
1
Ali Mhamad Slim

Si vous traitez avec des signes diacritiques, vous pouvez également ajouter JSON_PARTIAL_OUTPUT_ON_ERROR pour ne supprimer que les problèmes et laisser le reste intact. J'ai utilisé utf_encode avant de trouver ceci, mais ça bousillerait les signes diacritiques. 

echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR);
0
mihaidp

Par le PHP docs

Cette fonction ne fonctionne qu'avec les données codées UTF-8.

0
AlienWebguy