[英]HTML source code from TWebBrowser - How to detect Stream encoding?
基於以下問題: 如何從TWebBrowser獲取HTML源代碼
如果我使用具有Unicode代碼頁的html頁面運行此代碼 ,則結果是亂碼,因為TStringStream在D7中不是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;
編輯:我找到了這篇文章- 如何以類似Delphi的方式在TWebBrowser中加載和保存文檔
正是我需要的。 但它只能與Delphi Unicode編譯器(D2009 +)一起正常工作。 閱讀結論部分:
顯然,我們還有很多事情要做。 立刻想到了幾件事。 我們對Unicode功能進行了改型,並在Unicode之前的編譯器代碼中支持非ANSI編碼。 如果文檔字符集不是ANSI,則用Delphi 2009之前的任何版本編譯的當前代碼將無法將文檔內容正確保存到字符串中。
魔術顯然在TEncoding
類( TEncoding.GetBufferEncoding
)中。 但是D7沒有TEncoding
。 有任何想法嗎?
我使用GpTextStream處理轉換(對於所有Delphi版本均適用):
function GetCodePageFromHTMLCharSet(Charset: WideString): Word;
const
WIN_CHARSET = 'windows-';
ISO_CHARSET = 'iso-';
var
S: string;
begin
Result := 0;
if Charset = 'unicode' then
Result := CP_UNICODE else
if Charset = 'utf-8' then
Result := CP_UTF8 else
if Pos(WIN_CHARSET, Charset) <> 0 then
begin
S := Copy(Charset, Length(WIN_CHARSET) + 1, Maxint);
Result := StrToIntDef(S, 0);
end else
if Pos(ISO_CHARSET, Charset) <> 0 then // ISO-8859 (e.g. iso-8859-1: => 28591)
begin
S := Copy(Charset, Length(ISO_CHARSET) + 1, Maxint);
S := Copy(S, Pos('-', S) + 1, 2);
if S = '15' then // ISO-8859-15 (Latin 9)
Result := 28605
else
Result := StrToIntDef('2859' + S, 0);
end;
end;
function GetWebBrowserHTML(WebBrowser: TWebBrowser): WideString;
var
LStream: TMemoryStream;
Stream: IStream;
LPersistStreamInit: IPersistStreamInit;
TextStream: TGpTextStream;
Charset: WideString;
Buf: WideString;
CodePage: Word;
N: Integer;
begin
Result := '';
if not Assigned(WebBrowser.Document) then Exit;
LStream := TMemoryStream.Create;
try
LPersistStreamInit := WebBrowser.Document as IPersistStreamInit;
Stream := TStreamAdapter.Create(LStream, soReference);
if Failed(LPersistStreamInit.Save(Stream, True)) then Exit;
Charset := (WebBrowser.Document as IHTMLDocument2).charset;
CodePage := GetCodePageFromHTMLCharSet(Charset);
N := LStream.Size;
SetLength(Buf, N);
TextStream := TGpTextStream.Create(LStream, tsaccRead, [], CodePage);
try
N := TextStream.Read(Buf[1], N * SizeOf(WideChar)) div SizeOf(WideChar);
SetLength(Buf, N);
Result := Buf;
finally
TextStream.Free;
end;
finally
LStream.Free();
end;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.