在Laravel中,'格式错误的UTF-8字符,可能是错误编码的'

问题描述 投票:29回答:8

我正在使用Laravel(一个PHP框架)为移动设备编写服务,并以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' ));

但它仍然无法正常工作。

我该如何解决?

php json laravel-4 utf-8
8个回答
45
投票

我编写了这个方法来处理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);

24
投票

我找到了这个问题的答案here

做就是了

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

2
投票

在我的情况下,我在亚洲字母字符串上有一个ucfirst。这是不可能的,并产生一个非utf8字符串。


1
投票

我遇到了同样的问题。问题是我忘了在xampp中启动apache和mysql ...:S


1
投票

为了获得更多的解决方案,我已经完成了(伟大的)TiagoGouvêa的解决方案,仅用于字符串和数组

我使用md_convert_encoding()函数而不是utf8_encode(),它适用于我:( 12小时松动...)

//这个对象给我一个大数组,它有多个数组imbricated

$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,没有任何功能,因为我们通常做但但是如果我不这样做,第二个服务器不会发回任何东西应用此功能......

0
投票

在我的情况下,这会导致错误:

return response->json(["message" => "Model status successfully updated!", "data" => $model], 200);

但这不是:

return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200);

0
投票

我收到此错误,我修复了iconv函数的问题,如下所示:

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

0
投票

我知道这已经是一个老问题了,但我今天也遇到了同样的错误。对我来说,在模型上设置连接变量就可以了。

/**
 * Table properties
 */
protected $connection = 'mysql-utf8';
protected $table = 'notification';
protected $primaryKey = 'id';

我不知道问题是否与数据库(可能)有关,但是带有特殊字符的文本字段(如〜,'e等)都搞砸了。

© www.soinside.com 2019 - 2024. All rights reserved.