2015-12-01 1 views
5

Le problème est que je ne peux pas utiliser de symboles russes dans la méthode response()->json(). J'ai déjà essayé le code suivant:Est-il possible d'utiliser des symboles cyrilliques dans Lumen (par 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'); 

J'ai vérifié l'encodage par défaut:

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

De plus, tous mes fichiers ont été convertisseur en UTF-8 sans BOM. J'ai également ajouté le jeu de caractères par défaut au fichier .htaccess (AddDefaultCharset utf-8).

Mais, je reçois toujours la mauvaise réponse comme ici:

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

Pourquoi pensez-vous que c'est une mauvaise réponse? –

+0

Je veux dire que c'est faux pour moi)). Je m'attends à '{'users': 'тест'}' – Sergey

+0

'u0442' est une représentation unicode de' т' –

Répondre

7

La réponse que vous obtenez:

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

est valide JSON!

Cela dit, si vous ne voulez pas coder les caractères UTF-8, vous pouvez simplement faire ceci:

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

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

La sortie serait alors

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

Pourquoi ce travail?

L'appel de l'assistant response() va créer une instance de Illuminate\Routing\ResponseFactory. fonction de jsonResponseFactory a la signature suivante:

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

Appel json() va créer une nouvelle instance de Illuminate\Http\JsonResponse, qui sera la classe responsable de la gestion json_encode pour vos données. A l'intérieur de la fonction setData dans JsonResponse, votre tableau sera codé avec le $options fourni sur l'appel response()->json(...):

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

Comme vous pouvez le voir sur le documentation on php.net for the json_encode function et le documentation on php.net for the json_encode Predefined Constants, JSON_UNESCAPED_UNICODE codera caractères multi-octets Unicode littéralement (par défaut est d'échapper comme \ uXXXX).

Il est important de noter que JSON_UNESCAPED_UNICODE n'est supporté que depuis PHP 5.4.0, alors assurez-vous que vous utilisez 5.4.0 ou plus récent pour l'utiliser.

+0

Lumen ne fonctionne pas avec php <5.4, il faut probablement le 5.5.9 depuis le début (bien que la contrainte du compositeur n'ait été ajoutée que récemment) – tacone

+0

Merci pour la clarification @timgws! C'est la très belle réponse! – Sergey

+0

@tacone vous avez raison de dire que lumen ne fonctionne pas avec PHP> = 5.5.9, mais la note pour PHP <5.4.0 est liée à json_encode, et pas directement pour le framework Laravel. – timgws