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以外の文字列を生成しました。
より多くの解決策については、文字列と配列のみに対して以前に公開された(素晴らしい)TiagoGouvêaの解決策を完了しました
私はutf8_encode()の代わりにmd_convert_encoding()関数を使用しました、それは私のために機能します:(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);
このエラーが発生し、次のようなiconv
関数の問題を修正しました。
iconv('latin5', 'utf-8', $data['index']);
私の場合、これによりエラーが発生します。
return response->json(["message" => "Model status successfully updated!", "data" => $model], 200);
しかし、これはそうではありません:
return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200);
同じ問題が発生しました。問題は、xamppでApacheとmysqlを起動するのを忘れたことです...:S
私はそれがすでに古い質問であることを知っていますが、今日同じエラーがありました。私にとっては、モデルに接続変数を設定することでうまくいきました。
/**
* Table properties
*/
protected $connection = 'mysql-utf8';
protected $table = 'notification';
protected $primaryKey = 'id';
データベースに問題があるかどうかはわかりませんが(おそらく)、特殊文字(〜、 ´eなど)のテキストフィールドはすべて台無しになりました。