2015-12-01 12 views
5

Problem polega na tym, że nie mogę używać żadnych rosyjskich symboli w metodzie response()->json(). Ja już próbowałem następujący kod:Czy można używać symboli cyrylicy w Lumen (przez 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'); 

Sprawdziłem domyślnego kodowania:

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

Również wszystkie moje pliki zostały konwerter do UTF-8 bez BOM. Dodałem także domyślny zestaw znaków do pliku .htaccess (AddDefaultCharset utf-8).

Ale ja wciąż złą odpowiedź jak tutaj:

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

Dlaczego uważasz, że to niewłaściwa odpowiedź? –

+0

Mam na myśli, że jest źle dla mnie)). Spodziewam się, że '{'users': 'тест'}' – Sergey

+0

'u0442' jest reprezentacją Unicode' т'A –

Odpowiedz

7

Reakcja że otrzymujesz:

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

JSON jest ważna!

W takiej sytuacji, jeśli nie chcesz do kodowania znaków UTF-8, wystarczy po prostu to zrobić:

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

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

Wyjście będzie wówczas

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

Dlaczego ta praca?

Wywołanie pomocnika response() spowoduje utworzenie instancji Illuminate\Routing\ResponseFactory. json funkcja ResponseFactory „s ma następujący podpis:

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

Wywołanie json() stworzy nową instancję Illuminate\Http\JsonResponse, który będzie odpowiedzialny za prowadzenie klasa json_encode dla Twoich danych. Wewnątrz funkcji w JsonResponsesetData, macierzy zostaną zakodowane przy $options przewidzianego na response()->json(...) rozmowy:

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

Jak widać na documentation on php.net for the json_encode function i documentation on php.net for the json_encode Predefined Constants, JSON_UNESCAPED_UNICODE zakoduje wielobajtowe znaki Unicode dosłownie (domyślnie jest uciec jako \ uXXXX).

Należy pamiętać, że JSON_UNESCAPED_UNICODE jest obsługiwany tylko od wersji 5.4.0, więc upewnij się, że używasz wersji 5.4.0 lub nowszej, aby z niej korzystać.

+0

Lumen nie działa z php <5.4, prawdopodobnie wymagał 5.5.9 od początku (chociaż ograniczenie kompozytora zostało dodane dopiero niedawno) – tacone

+0

Dziękujemy za wyjaśnienie @timgws! To naprawdę fajna odpowiedź! – Sergey

+0

@tacone masz rację, że lumen nie działa z PHP> = 5.5.9, ale notatka dla PHP <5.4.0 jest związana z json_encode, a nie bezpośrednio dla frameworka Laravel. – timgws

Powiązane problemy