Php charset=我的内容类型中的us ascii

Php charset=我的内容类型中的us ascii,php,htmltidy,Php,Htmltidy,我在apache Web服务器上有一个PHP网站。那个网站已经运行多年了 几周前,我不得不重新安装那台机器,所以我做了并检查了所有备份,重新安装了操作系统(Gentoo),在新机器上,用相同版本的apache和php恢复了网站 我做了一个快速检查,页面加载了,没有更多,一切似乎都很好 今天我不得不重新开始使用该网站,当我在浏览器中检查输出代码时,我发现: 问题是,Apache被设置为以utf-8的形式发送内容,php的默认字符集为utf-8,文件都保存为utf-8,php代码生成的内容类型为

我在apache Web服务器上有一个PHP网站。那个网站已经运行多年了

几周前,我不得不重新安装那台机器,所以我做了并检查了所有备份,重新安装了操作系统(Gentoo),在新机器上,用相同版本的apache和php恢复了网站

我做了一个快速检查,页面加载了,没有更多,一切似乎都很好

今天我不得不重新开始使用该网站,当我在浏览器中检查输出代码时,我发现:


问题是,Apache被设置为以utf-8的形式发送内容,php的默认字符集为utf-8,文件都保存为utf-8,php代码生成的内容类型为utf-8。美国ascii值来自哪里

在生成代码的PHP中,一切都是正确的

ob_start();
//检查输出
var_dump($tmp);退出(文件行);
//如果出现问题,发送干净的HTML文档或原始XML
如果($tmp['final_document']!==false){
echo($tmp[‘最终文件’);
}否则{
echo($tmp['xml_content']);
}
ob_end_flush();
上面的var_转储输出具有正确内容类型的XHTML源


但如果我正常发送页面,则编码为ascii

据我记忆所及,我所做的唯一改变是设置mod_security,而不是别的

我应该检查什么?哪些文件?什么配置

注意:

我只包括Apache标记,因为我认为问题与此相关,var_转储显示PHP正确生成代码。如果问题有所不同,我会相应地调整标签

我更新了标签以反映情况和解决方案

更新-解决方案:


根据建议,我从该部分删除了解决方案,并将其添加为答案。

该问题是由网站中的一个配置行引起的,在配置部分,我有以下内容:

ini\u集('tidy.clean\u output',true);
但这次我没有安装tidy,因为我早就决定停止使用它,自己做美容了。在备份/还原过程之前,我停止使用tidy,但它仍然安装在我的系统上,而且我显然忘记删除该配置行,因此该站点仍然在使用它,至少在删除tidy的个人配置后,所有默认值都在使用它;它在另一个文件中

这个错误告诉我,当您使用tidy时,至少在默认情况下,最终输出从PHP解析器到tidy,从那里到Apache,再从那里到用户。我在内部流程的一个非常特定的部分中使用了tidy,所以我不知道/记得PHP在默认情况下是如何/何时向它发送信息的。虽然在最后发送是有意义的,因为我使用的是输出缓冲


我们可以在中看到默认字符集是ascii。

那么,您发送的内容实际上是否包含非ascii字符?该内容类型可能是应用于该内容的某些自动启发的结果。在将应用程序从8位编码移植到utf-8时,我遇到了巨大的问题。这种启发式的实现通常是“有限的”……谢谢你的评论。是的,这个页面有不同语言的内容,主要是西班牙语。我想你是说它包含非ascii字符?这些字符是否包含在前500个字符中?和:如果内容以ascii格式发送,字符如何编码?尝试将传输的内容直接转储到文件中(中间不使用任何应用程序),并使用十六进制编辑器检查内容。这是唯一可靠的方法来判断内容是否被更改,或者是否只是用错误的值指定的编码(whyever)。在您的第二次评论之后,我仔细检查了HTML源代码,发现正在对非ascii字符进行编码,这在以前从未发生过;例如,这是对á;。关于您的特定问题,前500个字符中没有非ascii字符,或者至少,不总是,它取决于页面的标题、描述或关键字。我做了一个在标题上写非ascii字符的测试,结果是一样的。我将尝试在没有浏览器的服务器上检查输出。您仍然应该将解决方案分离成一个答案,然后它将显示为,这样问题就得到了回答。