PHP Include函数输出未知字符
当使用php include函数时,include会成功执行,但是在输出include的输出之前,它也会输出一个char,char的十六进制值为3F,我不知道它从哪里来,尽管似乎每个包含都会发生。
起初我认为这是文件编码,但这似乎不是问题。我创建了一个测试用例来演示它:(链接不再起作用)http://driveficiently.com/testinclude.php该文件仅包含:
<? include("include.inc"); ?>
并且include.inc仅包含:
<? echo ("hello, world"); ?>
但是,输出是:"?hello,world",其中?是具有随机值的char。我不知道是这个值的来源,有时它使我的网站有些混乱。
关于这可能来自哪里的任何想法?起初,我认为这可能与文件编码有关,但我认为这不是问题。
解决方案
回答
我在我们链接到的页面上看到了"你好,世界"。我看不到任何问题...
我正在使用Firefox 3.0.1和Windows XP。我们正在运行什么浏览器/操作系统?也许这可能是问题所在。
回答
字符3F实际上是问号,它不仅显示为一个。
我得到与托马斯相同的结果,没有出现问号。
从理论上讲,Web代理可能存在一些问题,但是我倾向于怀疑PHP标记中有一个迷失的问号...也许我们现在已经解决了这个问题,所以我们看不到问题。
回答
它不会显示在Firefox或者IE中的渲染页面上,但是当我们在IE中查看源代码时,我们会看到有趣的角色
这是在Linux机器上吗?我们是否可以查找并替换为vim或者sed,以查看是否可以通过这种方式摆脱3F?
如果在Windows上,请尝试使用记事本打开include.inc,以查看有趣的字符是否可见并可以删除。
我也很好奇,如果我们从包含中复制代码并直接运行它会发生什么。
回答
Web服务器(或者文本编辑器)显然在文档中包含BOM。除了将网站的编码明确设置为Latin-1以外,我在浏览器中看不到流氓字符。然后,我看到两个(!)UTF-8 BOM。
/ EDIT:从存在两个BOM表的事实出发,我得出结论:编辑器实际上将BOM表包含在文件的开头。我们使用什么编辑器?如果使用Visual Studio,则必须说另存为?在"文件"菜单中,然后选择"使用编码保存"按钮。在此处,选择不带BOM或者类似内容的UTF-8.
回答
我们看到的是一个UTF-8字节顺序标记:
The UTF-8 representation of the BOM is the byte sequence EF BB BF, which appears as the ISO-8859-1 characters ??? in most text editors and web browsers not prepared to handle UTF-8. Byte Order Mark on Wikipedia
PHP无法理解这些字符应该被"隐藏",因此会将它们发送到浏览器,就好像它们是普通字符一样。要摆脱它们,我们将需要使用"适当的"文本编辑器打开文件,该编辑器将允许我们将文件另存为UTF-8,而无需使用领先的BOM。
我们可以在此处阅读有关此问题的更多信息
回答
I'd also be curious to see what happens if you copy the code out of the include and just run it by itself.
马克:这是在共享托管解决方案上,所以我无法通过外壳访问文件。但是,正如我们在此处看到的,没有不应该存在的字符,并且运行与脚本相同的文件不会产生此字符。 (共享托管公司已获得0帮助,并不断告诉我这是浏览器问题)。