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

Php 如何让Symfony在所有响应中指定我的字符集?,php,symfony,Php,Symfony,我的Symfony 2应用程序的所有响应都有以下标题行: Content-Type: text/html 因此,我的浏览器假定输出字符集为ISO-8859-1。我想在标题中说: Content-Type: text/html; charset=utf8 相反。我知道我可以为每个响应手动执行此操作,如下所示: $response->setCharset('UTF-8'); $app->after( function (Request $request, Response

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

Content-Type: text/html
因此,我的浏览器假定输出字符集为ISO-8859-1。我想在标题中说:

Content-Type: text/html; charset=utf8
相反。我知道我可以为每个响应手动执行此操作,如下所示:

$response->setCharset('UTF-8');
$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;
    }
);
但这将是令人难以置信的冗余,因为我的应用程序有很多控件,并且只能输出UTF-8。我徒劳地搜索了控制默认字符集的Symfony配置设置。我找到了
framework.charset
,但这似乎不相关,而且默认情况下是UTF-8

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


我的想法 我知道这不是什么大问题(大多数时候),因为我可以在HTML和XML中显式指定字符集。问题是当我使用纯文本或JSON服务时,或者如果我使用
var\u dump
转储变量时。在这两种情况下,由于我的浏览器冒险进行错误猜测,所有非ASCII符号都被置乱


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

我认为您可以告诉框架在config.yml中使用哪个字符集:

framework:
  charset:         UTF-8

请参阅:

如果没有其他帮助,请继续使用
$response->setCharset('UTF-8'),但将其放在内核响应侦听器中。这是Symfony中的一种通用模式:每次在许多控制器中执行(几乎)相同的操作时,它都应该转到内核响应侦听器,以使控制器代码直截了当。

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

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

此外,如果您希望json输出显示为不带转义的utf8字符,可以使用如下方式:

$response->setCharset('UTF-8');
$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;
    }
);

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

在Symfony 3.1中,只需覆盖应用内核中的getCharset()


RuntimeException:不推荐使用字符集设置。只需将其从配置文件中删除。
charset设置已被弃用。使用AppKernel::getCharset