我正在使用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' ));
但它仍无效。
我该如何解决?
答案 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)
答案 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);
答案 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}"