PHP包含输出未知字符的函数

时间:2008-09-03 13:23:43

标签: php encoding byte-order-mark

当使用php include函数时,include成功执行,但是在输出include的输出之前它也输出一个char,char是十六进制值3F,我不知道它来自哪里,虽然似乎每个包含都会发生。

起初我认为它是文件编码,但这似乎不是问题。我创建了一个测试用例来演示它:(链接不再工作http://driveefficiently.com/testinclude.php此文件仅包含:

<? include("include.inc"); ?>

和include.inc仅包含:

<? echo ("hello, world"); ?> 

然而,输出是:“?hello,world”在哪里?是一个具有随机值的char。正是这个价值我不知道它的起源,它有时会搞砸我的网站。

关于这可能来自哪里的任何想法?起初我以为它可能与文件编码有关,但我不认为这是一个问题。

6 个答案:

答案 0 :(得分:11)

您所看到的是UTF-8字节顺序标记:

  

BOM的UTF-8表示是字节序列EF BB BF,在大多数未准备好处理UTF-8的文本编辑器和Web浏览器中显示为ISO-8859-1字符。

     

Byte Order Mark on Wikipedia

PHP不明白这些字符应该被“隐藏”并将它们发送到浏览器,就像它们是普通字符一样。要摆脱它们,您需要使用“正确的”文本编辑器打开文件,这样您就可以将文件保存为UTF-8,而不需要使用前导BOM。

You can read more about this problem here

答案 1 :(得分:3)

您的网络服务器(或文本编辑器)显然在文档中包含BOM。我没有在浏览器中看到流氓角色,除非我将网站的编码明确设置为Latin-1。然后,我看到两个(!)UTF-8 BOM表。

/编辑:由于存在两个 BOM,我得出结论,编辑器实际上是在文件开头包含了BOM。你用什么编辑器?如果您使用Visual Studio,则必须在“文件”菜单中说“另存为...”,然后选择“使用编码保存...”按钮。在那里,选择“没有BOM的UTF-8”或类似的东西。

答案 2 :(得分:1)

它没有显示在Firefox或IE中的渲染页面上,但是当您在IE中查看源时,您可以看到有趣的角色

enter image description here

这是在Linux机器上吗?你能找到&amp;用vim或sed替换,看看你是否能以这种方式摆脱3F?

如果它在Windows上,请尝试使用记事本打开include.inc以查看有趣的字符是否可见&amp;可以删除。

我也很想知道如果你将代码复制出来并将其自行运行会发生什么。

答案 3 :(得分:0)

我在您链接的页面上看到hello, world。没问题我能看到......

我正在使用Firefox 3.0.1和Windows XP。你在运行什么浏览器/操作系统?也许这可能是问题所在。

答案 4 :(得分:0)

字符3F实际上问号,它不只是显示为一个。

我得到与托马斯相同的结果,没有出现问号。

从理论上讲,它可能是Web代理的一些问题,但我倾向于怀疑你的PHP标记中存在一个流浪的问号......也许你现在已经解决了这个问题,所以我们没有看到问题。

答案 5 :(得分:0)

  

我也很想知道什么   如果您复制代码,则会发生   包含并单独运行它。

Mark:这是在共享托管解决方案上,因此我无法获得对该文件的shell访问权限。但是,正如您可以看到here,没有不应该存在的字符,并且运行与脚本相同的文件不会产生此字符。 (共享托管公司一直提供帮助,不断告诉我这是一个浏览器问题。)