J'utilise Laravel (un framework PHP) pour écrire un service pour mobile et obtenir les données au format JSON
. Dans le résultat des données, certains champs sont codés dans UTF-8
.
La déclaration suivante
return JsonResponse::create($data);
renvoie l'erreur ci-dessous
InvalidArgumentException
HELP
Malformed UTF-8 characters, possibly incorrectly encoded
Open: /var/www/html/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php
} catch (\Exception $exception) {
restore_error_handler();
throw $exception;
}
if (JSON_ERROR_NONE !== json_last_error()) {
throw new \InvalidArgumentException($this->transformJsonError());
}
J'ai changé:
return JsonResponse::create($data);
à
return JsonResponse::create($data, 200, array('Content-Type'=>'application/json; charset=utf-8' ));
mais ça ne marche toujours pas.
Comment puis-je le réparer?
J'ai écrit cette méthode pour gérer les tableaux UTF8 et les problèmes JSON. Cela fonctionne bien avec un tableau (simple et multidimensionnel).
/**
* Encode array from latin1 to utf8 recursively
* @param $dat
* @return array|string
*/
public static function convert_from_latin1_to_utf8_recursively($dat)
{
if (is_string($dat)) {
return utf8_encode($dat);
} elseif (is_array($dat)) {
$ret = [];
foreach ($dat as $i => $d) $ret[ $i ] = self::convert_from_latin1_to_utf8_recursively($d);
return $ret;
} elseif (is_object($dat)) {
foreach ($dat as $i => $d) $dat->$i = self::convert_from_latin1_to_utf8_recursively($d);
return $dat;
} else {
return $dat;
}
}
// Sample use
// Just pass your array or string and the UTF8 encode will be fixed
$data = convert_from_latin1_to_utf8_recursively($data);
J'ai trouvé la réponse à ce problème ici
Il suffit de faire
mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
Dans mon cas, j'avais une ucfirst
sur la chaîne de lettres asiatique. Ce n'était pas possible et produisit une chaîne non utf8.
J'ai eu cette erreur et j'ai corrigé le problème avec la fonction iconv
comme suit:
iconv('latin5', 'utf-8', $data['index']);
Dans mon cas, cela provoque une erreur:
return response->json(["message" => "Model status successfully updated!", "data" => $model], 200);
mais ce n'est pas:
return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200);