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

Jer*_*dge 1 html delphi firefox cross-browser indy

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

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

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

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

至于Web服务器,我正在使用IdHTTPWebBrokerBridge(Indy)在Delphi中构建一个自定义HTTP应用程序,并简单地替换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;
Run Code Online (Sandbox Code Playgroud)

... SomeFile.html上面发布的空页面在哪里,该过程是默认请求处理程序的事件处理程序.

在Chrome,IE,Safari等中,一切都与原始代码完全相同.但是,Firefox(和Opera)正在制作这个:

<html>
<head>
</head>
<body>

<title>Test</title>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

如您所见,title标签已向下移动到body,并且一些随机字符出现在正文的开头.在Firefox中查看原始页面作为其原始文件时,它会正确显示.但是当在Delphi中使用我的Web服务器时,Firefox正在销毁这个页面(以及所有页面,就此而言).

有什么可以做到这一点以及如何解决它?

重现步骤

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

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

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

B)在Delphi XE2中,启动一个新项目: File > New > Other... > Web Broker > Web Server Application

C)选择Stand-alone VCL Application>下一步>完成

D)创建默认处理程序(右键单击WebModule1并选择Action Editor...)

E)对于DefaultHandleritem,转到Event Properties并转到Event Handler forOnAction

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

Response.ContentStream:= TFileStream.Create('C:\SomeDir\SomeFile.html', fmOpenRead or fmShareDenyNone);

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

UPDATE

感谢您的帮助,我开始意识到问题在于文件的BOM标签,它不属于那里.这是由于TFileStream工作原理,它加载文件的每一小部分,其中包括此代码.我改变了我的方法TStringList.LoadFromFile(),因为它会自动检测它,我也可以读取TStringList.Text分配给Response.Content.

Mas*_*ler 7

显然,这三个字符构成了Unicode UTF-8字节顺序标记.它们应该被放置在文件的开头而不是实际被渲染; 它们是元数据,让文本解释器知道正在使用的编码.不知道你为什么在文件中间看到一个!尝试在十六进制编辑器中打开原始文件,看看它是否嵌入了BOM.

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

  • BOM显示在"<body>"中的最可能原因是文件以空格开头,后跟BOM .... (2认同)