基于这个问题: How can I get HTML source code from TWebBrowser
如果我使用具有 Unicode 代码页的 html 页面运行此代码,则结果是乱码,因为 TStringStream 在 D7 中不是 Unicode。该页面可能是 UTF8 编码或其他 (Ansi) 代码页编码的。
如何检测 TStream/IPersistStreamInit 是否为 Unicode/UTF8/Ansi?
对于此函数,我如何始终将正确的结果作为WideString返回?
function GetWebBrowserHTML(const WebBrowser: TWebBrowser): WideString;
如果我用 TMemoryStream 替换 TStringStream,并将 TMemoryStream 保存到文件中,一切都很好。它可以是 Unicode/UTF8/Ansi。但我总是想将流返回为 WideString:
function GetWebBrowserHTML(const WebBrowser: TWebBrowser): WideString;
var
// LStream: TStringStream;
LStream: TMemoryStream;
Stream : IStream;
LPersistStreamInit : IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then exit;
// LStream := TStringStream.Create('');
LStream := TMemoryStream.Create;
try
LPersistStreamInit := WebBrowser.Document as IPersistStreamInit;
Stream := TStreamAdapter.Create(LStream,soReference);
LPersistStreamInit.Save(Stream,true);
// result := LStream.DataString;
LStream.SaveToFile('c:\test\test.txt'); // test only - file is ok
Result := ??? // WideString
finally
LStream.Free();
end;
end;
编辑:我找到了这篇文章 - How to load and save documents in TWebBrowser in a Delphi-like way
这正是我需要的。但它仅适用于 Delphi Unicode 编译器 (D2009+)。阅读结论部分:
显然我们可以做的还有很多。有几件事立刻浮现在脑海。我们将一些 Unicode 功能和对非 ANSI 编码的支持改进为预 Unicode 编译器代码。如果文档字符集不是 ANSI,则使用早于 Delphi 2009 的任何内容编译的当前代码将无法将文档内容正确保存为字符串。
魔术显然在TEncoding
类(TEncoding.GetBufferEncoding
)中。但D7没有TEncoding
。有任何想法吗?