8

我的 Symfony 2 应用程序的所有响应都有这个标题行:

Content-Type: text/html

所以我的浏览器假定输出字符集是 ISO-8859-1。我想标题说:

Content-Type: text/html; charset=utf8

反而。我知道我可以为每个这样的响应手动执行此操作:

$response->setCharset('UTF-8');

但这将是非常多余的,因为我的应用程序有很多控件并且只会输出 UTF-8。我徒劳地搜索了控制默认字符集的 Symfony 配置设置。我发现framework.charset但这似乎无关紧要,并且默认情况下是 UTF-8。

如何让 Symfony 在所有响应中指定我的字符集?


我的想法

我知道这不是什么大问题(大多数时候),因为我可以在 HTML 和 XML 中明确指定字符集。问题是当我服务纯文本或 JSON 时,或者我使用var_dump. 在这两种情况下,所有非 ASCII 符号都会被打乱,因为我的浏览器会进行错误的猜测。

我的备用解决方案是将响应类子类化并放入$this->setCharset('UTF-8')构造函数中。

4

4 回答 4

3

使用 setCharset()不会在 headers 中设置字符集

如果要在标头中指定 utf-8 编码,可以在 $app->run() 之前的某处使用以下代码

$app->after(
    function (Request $request, Response $response) {
        $response->headers->set(
            'Content-Type', 
            $response->headers->get('Content-Type') . '; charset=UTF-8'
        );

        return $response;
    }
);

此外,如果您希望使用未转义的 utf8 字符显示 json 输出,则可以使用以下内容:

$app->after(
    function (Request $request, Response $response) {
        $response->headers->set('Content-Type', $response->headers->get('Content-Type') . '; charset=UTF-8');

        if ($response instanceof JsonResponse) {
            $response->setEncodingOptions(JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        }

        return $response;
    }
);

它也设置了漂亮的打印:)

于 2016-10-26T15:58:41.823 回答
0

在 Symfony 3.1 中,只需覆盖 AppKernel 中的 getCharset()。http://symfony.com/doc/current/reference/configuration/kernel.html

// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function getCharset()
    {
        return 'ISO-8859-1';
    }
}
于 2016-11-02T09:42:18.230 回答
0

如果没有其他帮助,请继续使用$response->setCharset('UTF-8');,但将其放入内核响应侦听器中。这是 Symfony 中的一般模式:每次你在很多控制器中(几乎)做同样的事情时,它应该转到内核响应侦听器,而不是让控制器代码直截了当。

于 2016-10-01T14:12:03.850 回答
-1

我想你可以告诉框架在你的 config.yml 中使用哪个字符集:

framework:
  charset:         UTF-8

请参阅:http ://symfony.com/doc/current/reference/configuration/framework.html

于 2013-05-14T01:15:52.263 回答