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?
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);
Ich habe die Antwort auf dieses Problem gefunden hier
Mach einfach
mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
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);
In meinem Fall hatte ich eine ucfirst
auf der asiatischen Buchstabenfolge. Dies war nicht möglich und erzeugte eine nicht utf8-Zeichenfolge.
Ich habe diesen Fehler erhalten und das Problem mit der iconv
-Funktion wie folgt behoben:
iconv('latin5', 'utf-8', $data['index']);
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);
Ich habe das gleiche Problem erlebt. Die Sache ist, dass ich vergessen habe, den Apache und mysql in xampp zu starten ...: S
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.