Firefox销毁标题并添加随机字符

时间:2012-03-26 22:59:33

标签: html delphi firefox cross-browser indy

我遇到了Firefox最疯狂的问题。我不确定这个问题是来自Firefox本身,还是来自我的自定义Web服务器(内置Delphi)或它可能是什么。这个问题只发生在Firefox(和Opera)中,它既可以将所有内容从头部向下移动到正文,也可以在正文的开头添加随机字符。奇怪的是,它甚至可以使用完全100%空的网页。

我正在测试一个简单的页面:

<html>
<head>
    <title>Test</title>
</head>
<body>

</body>
</html>

对于Web服务器,我正在使用IdHTTPWebBrokerBridge(Indy)在Delphi中构建自定义HTTP应用程序,只需替换{{1}的ContentStream(或Content)像这样......

Request

...其中procedure TDashModule.DashConsoleHomeAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.ContentType:= 'text/html'; Response.ContentStream:= TFileStream.Create('C:\SomeDir\SomeFile.html', fmOpenRead or fmShareDenyNone); end; 是上面公布的空白页面,而且该过程是默认请求处理程序的事件处理程序。

在Chrome,IE,Safari等中,所有内容都与原始代码完全相同。但是,Firefox(和Opera)正在制作这个:

SomeFile.html

如您所见,<html> <head> </head> <body>  <title>Test</title> </body> </html> 标记已向下移至title,并且一些随机字符body出现在正文的最开头。在Firefox中查看原始页面作为其原始文件时,它会正确显示。但是当在Delphi中使用我的Web服务器时,Firefox正在破坏这个页面(以及所有页面)。

可以做什么以及如何解决?

重现的步骤

A)仅使用以下内容创建一个新的HTML页面(对我来说,在Visual Studio 2010中):



B)在Delphi XE2中,启动一个新项目:<html> <head> <title>Test</title> </head> <body> </body> </html>

C)选择File > New > Other... > Web Broker > Web Server Application&gt;下一个&gt;完成

D)创建默认处理程序(右键单击Stand-alone VCL Application并选择WebModule1

E)对于Action Editor...项,请转到“事件属性”并转到DefaultHandler的事件处理程序

F)用此替换已经存在的任何代码(用HTML文件名替换文件名):

OnAction

E)运行应用程序并单击“在浏览器中显示” - 如有必要,将URL复制/粘贴到Firefox。

更新

感谢您的帮助,我开始意识到问题在于文件的BOM标签,它不属于那里。这是由Response.ContentStream:= TFileStream.Create('C:\SomeDir\SomeFile.html', fmOpenRead or fmShareDenyNone);如何工作,它加载文件的每一小部分,其中包括此代码。我已将我的方法更改为使用TFileStream,因为这会自动检测到它,我还可以阅读TStringList.LoadFromFile()以分配给TStringList.Text

2 个答案:

答案 0 :(得分:7)

显然是those three characters constitute a Unicode UTF-8 Byte-Order Mark。它们应该被放置在文件的开头而不是实际被渲染;它们是元数据,让文本解释器知道正在使用的编码。不知道为什么你在文件的中间中看到了一个!尝试在十六进制编辑器中打开原始文件,看看它是否嵌入了BOM。

(如果你没有十六进制编辑器,你可以获得一个非常好的免费here。它甚至用Delphi编写!)

答案 1 :(得分:2)

这3个字符是UTF-8 BOM。 BOM不应该在那里。我不知道它来自哪里(也许它来自文件)但你需要删除它。

虽然错误肯定在你的尽头!不要被IE和Webkit浏览器显示页面的事实误入歧途。这只意味着那些浏览器是宽松的。