"Недовольные символы 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 и т.д.) Были перепутаны.