php - utf8 - malformed utf-8 characters possibly incorrectly encoded laravel
''Caracteres UTF-8 con formato incorrecto, posiblemente codificados incorrectamente'' en Laravel (5)
Estoy usando Laravel (un marco PHP) para escribir un servicio para dispositivos móviles y que los datos se devuelvan en formato JSON
. En el resultado de datos hay algunos campos codificados en UTF-8
.
La siguiente declaración
return JsonResponse::create($data);
devuelve el error de abajo
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());
}
He cambiado:
return JsonResponse::create($data);
a
return JsonResponse::create($data, 200, array(''Content-Type''=>''application/json; charset=utf-8'' ));
Pero todavía no funciona.
¿Cómo puedo arreglarlo?
En mi caso tuve un ucfirst
en la cadena de letras asiáticas. Esto no fue posible y produjo una cadena no utf8.
En mi caso, esto provoca error:
return response->json(["message" => "Model status successfully updated!", "data" => $model], 200);
pero esto no:
return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200);
Escribí este método, para manejar matrices UTF8 y problemas JSON. Funciona bien con array (simple y multidimensional).
/**
* 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);
He encontrado la respuesta a este problema here
Solo haz
mb_convert_encoding($data[''name''], ''UTF-8'', ''UTF-8'');
Recibí este error y solucioné el problema con la función iconv
como la siguiente:
iconv(''latin5'', ''utf-8'', $data[''index'']);