Delphi 获取IHTMlement.body.innerHTML作为ansi字符串
我有带unicode符号的html标记:Delphi 获取IHTMlement.body.innerHTML作为ansi字符串,delphi,unicode,character-encoding,innerhtml,twebbrowser,Delphi,Unicode,Character Encoding,Innerhtml,Twebbrowser,我有带unicode符号的html标记: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML xmlns:o = "urn:schemas-microsoft-com:office:office"><HEAD> <META content="text/html; charset=windows-1251" http-equiv=Content-Type> <
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML xmlns:o = "urn:schemas-microsoft-com:office:office"><HEAD>
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 9.00.8112.16441"></HEAD>
<BODY>
<P>ψ</P></BODY></HTML>
符号&968;我使用IHTMLTxtRange.pasteHTML插入。当我使用HTMLDocument2.body.innerHTML时,我想得到&968
,但不是Unicode字符串函数的字符串表示形式,而是返回Unicode BSTR 其中&968;ψ是Unicode字符$03C8另一种解决方法function GetInnerHTMLFromBody(const ADocument: IHTMLDOCUMENT2): AnsiString;
var
ms: TMemoryStream;
startBody: integer;
stopBody: integer;
const
bodyTag = '<BODY>';
closedBodyTag = '</BODY>';
begin
Result := '';
if ADocument <> nil then
begin
ms := TMemoryStream.Create;
try
Succeeded((ADocument as IPersistStreamInit).Save(
TStreamAdapter.Create(ms, soReference) as IStream, true));
ms.Seek(0, soFromBeginning);
SetLength(Result, ms.size);
ms.ReadBuffer(Result[1], ms.size);
// better to use regexpr
startBody := AnsiPos(bodyTag, Result) + Length(bodyTag);
stopBody := AnsiPos(closedBodyTag, Result);
Result := Copy(Result, startBody, stopBody - startBody);
finally
ms.Free;
end;
end;
end;
另一个解决办法
function GetInnerHTMLFromBody(const ADocument: IHTMLDOCUMENT2): AnsiString;
var
ms: TMemoryStream;
startBody: integer;
stopBody: integer;
const
bodyTag = '<BODY>';
closedBodyTag = '</BODY>';
begin
Result := '';
if ADocument <> nil then
begin
ms := TMemoryStream.Create;
try
Succeeded((ADocument as IPersistStreamInit).Save(
TStreamAdapter.Create(ms, soReference) as IStream, true));
ms.Seek(0, soFromBeginning);
SetLength(Result, ms.size);
ms.ReadBuffer(Result[1], ms.size);
// better to use regexpr
startBody := AnsiPos(bodyTag, Result) + Length(bodyTag);
stopBody := AnsiPos(closedBodyTag, Result);
Result := Copy(Result, startBody, stopBody - startBody);
finally
ms.Free;
end;
end;
end;
你能告诉我们你是如何得到innerHTML值的代码吗?您尝试过innerText吗?@TLama Save and display in ansi only text editor TMemoI是指显示HTMLDocument2.body.innerHTML调用的代码行,包括所有参数声明。或者尝试改用innerText。我不使用innerHTML,而是查询文档中的一个IPersist。。。接口,如IPersistStream,然后按原样将原始HTML读取到目标缓冲区。@kobik:以前Embarcadero论坛上已经发布过一些示例。搜索档案。在IHTMLDocument2接口上调用QueryInterface以获取IPersistStream接口,然后调用其save方法,向其传递一个IStream接口以将HTML的原始字节写入。您可以使用VCL的TStreamAdapter类获取一个IStream,以包装和公开任何TStream对象,例如TMemoryStream,作为一个IStream接口。您可以向我们展示如何获取innerHTML值的代码吗?您尝试过innerText吗?@TLama Save and display in ansi only text editor TMemoI是指显示HTMLDocument2.body.innerHTML调用的代码行,包括所有参数声明。或者尝试改用innerText。我不使用innerHTML,而是查询文档中的一个IPersist。。。接口,如IPersistStream,然后按原样将原始HTML读取到目标缓冲区。@kobik:以前Embarcadero论坛上已经发布过一些示例。搜索档案。在IHTMLDocument2接口上调用QueryInterface以获取IPersistStream接口,然后调用其save方法,向其传递一个IStream接口以将HTML的原始字节写入。您可以使用VCL的TStreamAdapter类获得一个IStream,将任何TStream对象(如TMemoryStream)包装并公开为一个IStream接口。奇怪的是,我在流结果中看到的只是。我一直使用@TLama的代码,直到“ShowMessage”…@kobik:当然,你必须将浏览器导航到一个URL,等待它加载HTML,然后才能检索其内容。@RemyLebeau,但为什么在使用PasteHTMLHTMLDoc时它不起作用;如TLama示例所示?文档DOM返回有效的innerHTML。@RemyLebeau,当像OP最初询问的那样使用IHTMLTxtRange.pasteHTML时,ISream的结果只返回30个字节。我会做更多的测试…奇怪的是,我在流中看到的结果是。我一直使用@TLama的代码,直到“ShowMessage”…@kobik:当然,你必须将浏览器导航到一个URL,等待它加载HTML,然后才能检索其内容。@RemyLebeau,但为什么在使用PasteHTMLHTMLDoc时它不起作用;如TLama示例所示?文档DOM返回有效的innerHTML。@RemyLebeau,当像OP最初询问的那样使用IHTMLTxtRange.pasteHTML时,ISream的结果只返回30个字节。我会做更多的测试。。。