2

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を使用する場合は、を取得したいのです<P>&#968;</P>が、Unicode文字の文字列関数の文字列表現の代わりにUnicode BSTRを返します。ここで&#968;(ψ)はUnicode文字です$ 03C8

4

1 に答える 1

0

別の回避策

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;

ただし、この方法は、ANSIエンコーディングのhtmlドキュメントでのみ機能します。Unicodeエンコーディングを使用する場合は、UnicodeからAnsiStringへの追加の変換を行う必要があります。

if SameText(Utf8ToAnsi(UTF8Encode(HTMLDocument2.charset)),'unicode') then
...
于 2012-04-05T19:18:08.533 に答える