web-dev-qa-db-ja.com

Laravelの「不正な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' ));

しかし、まだ機能していません。

どうすれば修正できますか?

31
Dzung Nguyen

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);
47
Tiago Gouvêa

この問題に対する答えを見つけました here

ただやる

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

私の場合、アジアの文字列にucfirstがありました。これは不可能であり、utf8以外の文字列を生成しました。

2
alex

より多くの解決策については、文字列と配列のみに対して以前に公開された(素晴らしい)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']);
0
Bora

私の場合、これによりエラーが発生します。

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

しかし、これはそうではありません:

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

同じ問題が発生しました。問題は、xamppでApacheとmysqlを起動するのを忘れたことです...:S

0
Wal Heredia

私はそれがすでに古い質問であることを知っていますが、今日同じエラーがありました。私にとっては、モデルに接続変数を設定することでうまくいきました。

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

データベースに問題があるかどうかはわかりませんが(おそらく)、特殊文字(〜、 ´eなど)のテキストフィールドはすべて台無しになりました。

0
ThiagoYou