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.
json_encode
veut seulement utf-8
. Selon votre jeu de caractères, vous pouvez utiliser iconv
ou utf8_encode
avant 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);
});
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 '|'
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);
<?
$sql=mysql_query("SELECT * FROM TABLE...");
while($row=mysql_fetch_array($sql))
{
$output[]=array_map("utf8_encode", $row);
}
print(json_encode($output));
mysql_close();
?>
$json = utf8_encode($string);
$json = json_decode($json);
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);
Par le PHP docs
Cette fonction ne fonctionne qu'avec les données codées UTF-8.