我遇到了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
。
答案 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浏览器显示页面的事实误入歧途。这只意味着那些浏览器是宽松的。