我的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')
放在构造函数中。
答案 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