"Недовольные символы UTF-8, возможно, неправильно закодированные" в Laravel
Я использую Laravel (фреймворк) для записи службы для мобильных устройств и данных, возвращаемых в формате JSON
. В результате данных есть несколько полей, закодированных в UTF-8
.
Следующее утверждение
return JsonResponse::create($data);
возвращает ошибку ниже
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());
}
Я изменил:
return JsonResponse::create($data);
к
return JsonResponse::create($data, 200, array('Content-Type'=>'application/json; charset=utf-8' ));
но он все еще не работает.
Как я могу это исправить?
Ответы
Ответ 1
Я написал этот метод для обработки массивов UTF8 и проблем JSON. Он отлично работает с массивом (простой и многомерный).
/**
* 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);
Ответ 2
Я нашел ответ на эту проблему здесь
Просто делать
mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
Ответ 3
В моем случае у меня была ucfirst
из азиатских букв. Это было невозможно и привело к появлению строки не utf8.
Ответ 4
Для большего решения я завершил решение (великого) Tiago Gouvêa, представленного ранее только для строк и массивов.
я использовал функцию md_convert_encoding() вместо utf8_encode(), она работает для меня: (12 часов потеряно...)
//этот объект возвращает мне большой массив с несколькими массивами
$get_days = program::get_days($ARR, $client);
//и я использую эту функцию для анализа того, что сервер возвращает *
function convert_to_utf8_recursively($dat){
if( is_string($dat) ){
return mb_convert_encoding($dat, 'UTF-8', 'UTF-8');
}
elseif( is_array($dat) ){
$ret = [];
foreach($dat as $i => $d){
$ret[$i] = convert_to_utf8_recursively($d);
}
return $ret;
}
else{
return $dat;
}
}
// use
$data = convert_to_utf8_recursively($get_days);
- что сервер возвращает * я говорю об этом, потому что я тестирую один и тот же код на двух разных серверах, первый возвращает мне хорошо отформатированный json, без какой-либо функции, как мы обычно делаем, НО второй сервер не отправляет мне обратно ничего, если я не применить эту функцию...
Ответ 5
В моем случае это вызывает ошибку:
return response->json(["message" => "Model status successfully updated!", "data" => $model], 200);
но это не так:
return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200);
Ответ 6
Я получил эту ошибку, и я исправил проблему с функцией iconv
следующим образом:
iconv('latin5', 'utf-8', $data['index']);
Ответ 7
Я испытал ту же проблему. Дело в том, что я забыл запустить apache и mysql в xampp...: S
Ответ 8
Я знаю, это уже старый вопрос, но у меня была та же ошибка сегодня. Для меня установка переменной подключения на модели сделала свою работу.
/**
* Table properties
*/
protected $connection = 'mysql-utf8';
protected $table = 'notification';
protected $primaryKey = 'id';
Я не знаю, была ли проблема с базой данных (возможно), но текстовые поля со специальными символами (например, ~, ´e и т.д.) Были перепутаны.