web-dev-qa-db-fra.com

"Caractères UTF-8 mal formés, éventuellement incorrectement codés" dans Laravel

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?

26
Dzung Nguyen

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);
38
Tiago Gouvêa

J'ai trouvé la réponse à ce problème ici

Il suffit de faire 

mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
16
Leo Leoncio

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. 

1
alex

J'ai eu cette erreur et j'ai corrigé le problème avec la fonction iconv comme suit:

iconv('latin5', 'utf-8', $data['index']);
0
Bora

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);
0
М.Б.