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

Posted

技术标签:

【中文标题】是否可以在 Lumen 中使用西里尔符号(Laravel 提供)?【英文标题】:Is it possible to use cyrillic symbols in Lumen(by Laravel)? 【发布时间】:2016-03-05 21:24:33 【问题描述】:

问题是我不能在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"

【问题讨论】:

为什么你认为这是错误的反应? 我的意思是这对我来说是错误的))。我期待'users': 'тест' u0442т 的 unicode 表示形式 酷!但是,我希望我不要手动将所有 unicode 符号转换为俄语。我想用这样的东西json_encode(['users', 'тест'], JSON_UNESCAPED_UNICODE) 可能不完全正确,但这段代码return response()->make(json_encode(['users' => 'тест'], JSON_UNESCAPED_UNICODE))->header('Content-Type', 'application/json; charset=utf-8'); 解决了我的问题。 【参考方案1】:

您得到的响应:

 "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 的实例。 ResponseFactoryjson 函数具有以下签名:

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

调用json() 将创建Illuminate\Http\JsonResponse 的新实例,该实例将是负责为您的数据运行json_encode 的类。在JsonResponse 中的setData 函数内,您的数组将使用response()->json(...) 调用中提供的$options 进行编码:

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

正如您在documentation on php.net for the json_encode function 和documentation on php.net for the json_encode Predefined Constants 上看到的,JSON_UNESCAPED_UNICODE 将对多字节Unicode 字符进行逐字编码(默认转义为\uXXXX)。

请务必注意,JSON_UNESCAPED_UNICODE 自 PHP 5.4.0 起才受支持,因此请确保您运行的是 5.4.0 或更高版本才能使用它。

【讨论】:

Lumen 不适用于 php 感谢@timgws 的澄清!这是一个非常好的答案! @tacone 你是正确的,lumen 不适用于 PHP >= 5.5.9,但 PHP

以上是关于是否可以在 Lumen 中使用西里尔符号(Laravel 提供)?的主要内容,如果未能解决你的问题,请参考以下文章

插入后 SQL 代码中的西里尔符号不正确

通过 Composer 下载 Lumen 时出错

PL/SQL:通过正则表达式查找所有西里尔文(或非拉丁文)符号

如果包含西里尔符号,Json RPC 返回错误响应

Alamofire 返回错误的编码

数学符号λ的用法