我尝试将头文件Content-Type
设置为text/html
,但没有指定字符集。如果我运行以下代码:
header('Content-Type: text/html');
var_dump(headers_list());
我得到以下输出:
['Content-type: text/html;charset=UTF-8']
charset
参数将自动添加!并且Content-Type
将更改为Content-type
。对于类型为text
的任何内容类型也会发生同样的情况。例如,Content-Type: text/foobar
将更改为Content-type: text/foobar;charset=UTF-8
。
如果我指定任何额外的参数,它们将被保留。例如,Content-Type: text/foobar; param=value
将变为Content-type: text/foobar; param=value;charset=UTF-8
。
如果我指定charset
参数,标头不会改变。例如,Content-Type: text/html; charset=ISO-8859-1
保持Content-Type: text/html; charset=ISO-8859-1
。在这种情况下,标头字段名称也不会从Content-Type
更改为Content-type
。
如果指定的内容类型不是text
,则标题不会更改。例如,Content-Type: foo/bar
保持不变。
没有charset
参数就不能指定基于文本的内容类型吗?我使用的是PHP 7.1.1和Apache 2.4.26。
1条答案
按热度按时间ut6juiuv1#
我能想到的最好办法就是
它仍然在响应头中得到复制的verbatum,但至少阻止PHP插入默认字符集,并且浏览器(在Firefox和Chrome中测试过)似乎能够科普空的charset参数,因为它等同于'not-specified' -所以您可以在HTML文件中使用其中声明的任何字符集。
在我的例子中,有一些硬编码的HTML文件使用与默认字符集不同的字符集。(我没有测试),如果不解析我正在服务的文件,我不知道它应该设置为什么。也许可以在
header
调用之前执行\ini_set('default_charset', '')
,但这可能会产生连锁React,而且可能不起作用(我还没有测试过)。我认为这是PHP中的一个bug或缺点。它应该可以阻止PHP自动将
charset
参数添加到Content-Type
头中,但显然没有。然而,我仍然在7.3上,所以也许事情已经改变了。欢迎评论是否在https://bugs.php.net/提交错误或是否存在现有的未决问题。