2015-12-01 13 views
5

Il problema è che non è possibile utilizzare alcun simbolo russo nel metodo response()->json(). Ho già provato il seguente codice:È possibile utilizzare i simboli cirillici in Lumen (di Laravel)?

return response()->json(['users' => 'тест']); 

and 

return response()->json(['users' => mb_convert_encoding('тест', 'UTF-8')]); 

and 

return response()->json(
     ['users' => mb_convert_encoding('тест', 'UTF-8')]) 
     ->header('Content-Type', 'application/json; charset=utf-8'); 

Ho controllato la codifica di default:

mb_detect_encoding('тест'); // returns 'UTF-8' 

Inoltre, tutti i miei file sono stati convertitore a UTF-8 senza BOM. Ho aggiunto anche il set di caratteri predefinito al file .htaccess (AddDefaultCharset utf-8).

Ma, ho ancora la risposta sbagliata come qui:

{"users":"\u0442\u0435\u0441\u0442"} 
+0

Perché pensi che sia una risposta sbagliata? –

+0

Voglio dire che è sbagliato per me)). Mi aspetto '{'users': 'тест'}' – Sergey

+0

'u0442' è una rappresentazione unicode di' т' –

risposta

7

La risposta che hai trovato:

{"users":"\u0442\u0435\u0441\u0442"} 

è valido JSON!

Detto questo, se non si vuole codificare i caratteri UTF-8, si può semplicemente fare questo:

$data = [ 'users' => 'тест' ]; 
$headers = [ 'Content-Type' => 'application/json; charset=utf-8' ]; 

return response()->json($data, 200, $headers, JSON_UNESCAPED_UNICODE); 

L'uscita sarebbe allora

{"users":"тест"} 

Perché questo lavoro?

Chiamando l'helper response() verrà creata un'istanza di Illuminate\Routing\ResponseFactory. Funzione ResponseFactory s' json ha la seguente firma:

public function json($data = [], $status = 200, array $headers = [], $options = 0)

Calling json() creerà una nuova istanza di Illuminate\Http\JsonResponse, che sarà la classe responsabile della gestione json_encode per i dati. All'interno della funzione setData in JsonResponse, l'array verrà codificato con il $options fornito sul response()->json(...) chiamata:

json_encode($data, $this->jsonOptions); 

Come si può vedere sul documentation on php.net for the json_encode function e la documentation on php.net for the json_encode Predefined Constants, JSON_UNESCAPED_UNICODE codificherà più byte caratteri Unicode letteralmente (default è di uscire come \ uXXXX).

È importante notare che JSON_UNESCAPED_UNICODE è stato supportato solo da PHP 5.4.0, quindi assicuratevi di utilizzare 5.4.0 o più recente per utilizzarlo.

+0

Il lumen non funziona con php <5.4, probabilmente ha richiesto il 5.5.9 dall'inizio (sebbene il vincolo del compositore sia stato aggiunto solo di recente) – tacone

+0

Grazie per il chiarimento @timgws! È la risposta davvero bella! – Sergey

+0

@tacone hai ragione che lumen non funziona con PHP> = 5.5.9, ma la nota per PHP <5.4.0 è correlata a json_encode, e non direttamente per il framework Laravel. – timgws

Problemi correlati