この質問に基づいて: TWebBrowser から HTML ソース コードを取得するにはどうすればよいですか?
Unicode コード ページを含む html ページでこのコードを実行すると、D7 では TStringStream が Unicode ではないため、結果は意味不明になります。ページは UTF8 でエンコードされているか、他の (Ansi) コード ページでエンコードされている可能性があります。
TStream/IPersistStreamInit が Unicode/UTF8/Ansi かどうかを検出するにはどうすればよいですか?
この関数のWideStringとして常に正しい結果を返すにはどうすればよいですか?
function GetWebBrowserHTML(const WebBrowser: TWebBrowser): WideString;
TStringStream を TMemoryStream に置き換えて、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
。何か案は?