我正在使用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' ));
但它仍然无法正常工作。
我该如何解决?
我编写了这个方法来处理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);
在我的情况下,我在亚洲字母字符串上有一个ucfirst
。这是不可能的,并产生一个非utf8字符串。
我遇到了同样的问题。问题是我忘了在xampp中启动apache和mysql ...:S
为了获得更多的解决方案,我已经完成了(伟大的)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);
在我的情况下,这会导致错误:
return response->json(["message" => "Model status successfully updated!", "data" => $model], 200);
但这不是:
return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200);
我收到此错误,我修复了iconv
函数的问题,如下所示:
iconv('latin5', 'utf-8', $data['index']);
我知道这已经是一个老问题了,但我今天也遇到了同样的错误。对我来说,在模型上设置连接变量就可以了。
/**
* Table properties
*/
protected $connection = 'mysql-utf8';
protected $table = 'notification';
protected $primaryKey = 'id';
我不知道问题是否与数据库(可能)有关,但是带有特殊字符的文本字段(如〜,'e等)都搞砸了。