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

时间:2013-05-14 00:53:44

标签: php symfony

我的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中明确指定charset。问题是我服务纯文本或JSON,或者我使用var_dump转储变量。在这两种情况下,所有非ASCII符号都会被扰乱,因为我的浏览器冒错了猜测。

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

4 个答案:

答案 0 :(得分:1)

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

如果要在标题中指定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;
    }
);

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

$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;
    }
);

它也设置了漂亮的印刷品:)

答案 1 :(得分:0)

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

答案 2 :(得分: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';
    }
}

答案 3 :(得分:-1)

我认为你可以告诉框架在config.yml中使用哪个charset:

framework:
  charset:         UTF-8

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