Delphi 获取IHTMlement.body.innerHTML作为ansi字符串

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> <

我有带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>
<META name=GENERATOR content="MSHTML 9.00.8112.16441"></HEAD>
<BODY>
<P>&#968;</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个字节。我会做更多的测试。。。