在Lumen(Laravel)中是否可以使用西里尔符号?

时间:2015-12-01 20:05:54

标签: php laravel utf-8 lumen cyrillic

问题是我不能在response()->json()方法中使用任何俄语符号。 我已经尝试过以下代码:

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');

我检查了默认编码:

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

此外,我的所有文件都已转换为UTF-8而没有BOM。我也将默认字符集添加到.htaccess文件(AddDefaultCharset utf-8)。

但是,我仍然得到错误的答案:

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

1 个答案:

答案 0 :(得分:8)

你得到的回应:

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

是有效的JSON!

话虽这么说,如果你不想编码UTF-8字符,你可以简单地这样做:

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

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

输出将是

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

为什么这样做?

调用response()帮助程序将创建Illuminate\Routing\ResponseFactory的实例。 ResponseFactory的{​​{1}}函数具有以下签名:

json

调用public function json($data = [], $status = 200, array $headers = [], $options = 0)将创建json()的新实例,该实例将是负责为您的数据运行Illuminate\Http\JsonResponse的类。在json_encode中的setData函数内,您的数组将使用JsonResponse调用中提供的$options进行编码:

response()->json(...)

正如您在documentation on php.net for the json_encode functiondocumentation on php.net for the json_encode Predefined Constants上看到的那样, json_encode($data, $this->jsonOptions); 将按字面编码多字节Unicode字符(默认为以\ uXXXX转义)。

请务必注意,自PHP 5.4.0起,JSON_UNESCAPED_UNICODE仅受支持,因此请确保运行5.4.0或更高版本以使用此功能。