基于这个问题:如何从TWebBrowser获取HTML源代码
如果我用一个具有Unicode编码的html页面运行这段代码,结果会是乱码,因为D7中的TStringStream不是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;
编辑:我找到了这篇文章 - 如何以Delphi方式在 TWebBrowser 中加载和保存文档
这正是我所需要的,但它只能在 Delphi Unicode 编译器(D2009+)中正确工作。请阅读结论部分:
我们可以做更多事情。有一些事情立即浮现出来。我们将Unicode功能和非ANSI编码支持适用于先前的Unicode编译器代码。如果文档字符集不是ANSI,则使用早于 Delphi 2009 的任何编译器编译的当前代码将不能正确地将文档内容保存到字符串中。
魔法显然在于 TEncoding
类(TEncoding.GetBufferEncoding
)。但 D7 没有 TEncoding
。有什么想法吗?
TWideStringList
和TJclWideStringList
,TNT Unicode组件也有TWideStringList
,我认为还有更多。也许其中一些还有COM IStringList适配器。无论如何,尝试这些或在Google、torry.net或其他收集器上搜索更多的Delphi 7 Unicode StringList实现。 - Arioch 'The