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

时间:2015-06-29 12:40:33

标签: php json laravel-4 utf-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' ));

但它仍无效。

我该如何解决?

13 个答案:

答案 0 :(得分:43)

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

答案 1 :(得分:22)

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

只做

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

答案 2 :(得分:2)

在我的情况下,我在亚洲字母字符串上有一个public class SomeObject{ String id; SomeNameObject name; //constructor and so on } 。这是不可能的,并产生一个非utf8字符串。

答案 3 :(得分:2)

在 Laravel 7.x 中,这帮助我摆脱了这个错误。

$newString = mb_convert_encoding($arr, "UTF-8", "auto");
return response()->json($newString);

答案 4 :(得分:1)

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

答案 5 :(得分:1)

有关更多解决方案,我已经完成了TiagoGouvê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,没有任何功能,因为我们通常会这样做,但是第二个服务器如果不应用此功能就不会向我发送任何信息...

答案 6 :(得分:0)

就我而言,这会导致错误:

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

但这不是:

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

我不知道问题是否出在数据库上(可能是),但是带有特殊字符(例如〜,´e等)的文本字段都被弄乱了。

答案 9 :(得分:0)

在建立与db之类的连接后将字符集设置为

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

if (!$conn->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $conn->error);
    exit();
} else {
    printf("Current character set: %s\n", $conn->character_set_name());
}

答案 10 :(得分:0)

当 Laravel 尝试以 Json 格式返回错误时(在开发 API 时),这发生在我身上。解决bug后,这个错误消失了。

答案 11 :(得分:0)

我遇到了同样的问题。但是,在我的情况下,我将表中的列指定为 varchar(255) 并且在进行插入时我的内容更大。所以它用来截断不能适应varchar列大小的部分。

为了解决这个问题,我将我的列类型更新为长文本,以便可以存储更大的文本。此外,添加了前端验证以防止文本大于列。 (我用它来存储草稿 js 转义 HTML)

答案 12 :(得分:-1)

第一件事,在.ENV文件中正确指定Mail的所有设置。

我为此花了6个小时

示例

MAIL_DRIVER=smtp
MAIL_MAILER=smtp
MAIL_HOST=smtp.yandex.ru
MAIL_PORT=465
MAIL_USERNAME=yourmail@yandex.ru
MAIL_PASSWORD=password //Create password for Apps in settings. NOT PASTE YOUR REAL MAIL PASSWORD
MAIL_ENCRYPTION=SSL
MAIL_FROM_ADDRESS=yourmail@yandex.ru
MAIL_FROM_NAME="${APP_NAME}"
相关问题