wake-up-neo.net

'Falsche UTF-8-Zeichen, möglicherweise falsch codiert' in Laravel

Ich verwende Laravel (ein PHP - Framework), um einen Dienst für mobile Geräte zu schreiben, und die Daten werden im JSON-Format zurückgegeben. Im Datenergebnis gibt es einige Felder, die in UTF-8 codiert sind. 

Die folgende Aussage

return JsonResponse::create($data); 

gibt den folgenden Fehler zurück

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());
        }

Ich habe mich verändert:

return JsonResponse::create($data);

zu

return JsonResponse::create($data, 200, array('Content-Type'=>'application/json; charset=utf-8' ));

aber es funktioniert immer noch nicht.

Wie kann ich es reparieren?

26
Dzung Nguyen

Ich habe diese Methode geschrieben, um UTF8-Arrays und JSON-Probleme zu behandeln. Es funktioniert gut mit Array (einfach und mehrdimensional).

/**
 * 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);
38
Tiago Gouvêa

Ich habe die Antwort auf dieses Problem gefunden hier

Mach einfach 

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

Für weitere Lösungen habe ich die Lösung von (dem großen) Tiago Gouvêa fertiggestellt, die zuvor nur für Streicher und Arrays verfügbar war

ich habe die Funktion md_convert_encoding () anstelle von utf8_encode () verwendet. Sie funktioniert bei mir:

// Dieses Objekt gibt mir ein großes Array zurück, in dem sich mehrere Arrays befinden

$get_days = program::get_days($ARR, $client);

// und ich benutze diese Funktion, um gut zu analysieren, was der Server zurückgibt *

                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);
  • was der Server zurückgibt * Ich spreche damit, weil ich den gleichen Code auf zwei verschiedenen Servern teste. Der erste gibt mir einen gut formatierten JSON ohne irgendeine Funktion zurück, wie wir es normalerweise tun, ABER der zweite Server sendet mir nichts zurück, wenn ich es nicht tue wende diese Funktion an ...

In meinem Fall hatte ich eine ucfirst auf der asiatischen Buchstabenfolge. Dies war nicht möglich und erzeugte eine nicht utf8-Zeichenfolge. 

1
alex

Ich habe diesen Fehler erhalten und das Problem mit der iconv-Funktion wie folgt behoben:

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

In meinem Fall verursacht dies einen Fehler: 

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

aber das nicht: 

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

Ich habe das gleiche Problem erlebt. Die Sache ist, dass ich vergessen habe, den Apache und mysql in xampp zu starten ...: S

0
Wal Heredia

Ich weiß, es ist schon eine alte Frage, aber ich hatte heute den gleichen Fehler. Für mich hat das Setzen der Verbindungsvariablen am Modell funktioniert.

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

Ich weiß nicht, ob das Problem bei der Datenbank lag (wahrscheinlich), aber die Textfelder mit Sonderzeichen (wie ~, ´e usw.) waren alle durcheinander.

0
ThiagoYou