2012-04-05 2 views
2

У меня есть HTML-разметку символа Юникода:Получить IHTMLElement.body.innerHTML в AnSi строку

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

+1

Не могли бы вы показать нам код, как вы получаете в 'значение innerHTML'? Вы попробовали 'innerText' вместо этого? – TLama

+0

@TLama Сохранить и отобразить только в текстовом редакторе ansi (TMemo) –

+0

Я имел в виду строку кода, отображающую вызов 'HTMLDocument2.body.innerHTML', включая все объявления параметров. Или попробуйте вместо этого использовать 'innerText'. – TLama

ответ

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; 

Однако этот метод работает только с документом html кодирования ANSI. Если кодировке Юникод вам нужно сделать дополнительное преобразование из Unicode в AnsiString:

if SameText(Utf8ToAnsi(UTF8Encode(HTMLDocument2.charset)),'unicode') then 
... 
+0

странно, все, что я вижу в результирующем результате, это «». Я использовал код @ TLama прямо до «ShowMessage» ... – kobik

+0

... но если я переведу «URL», он работает. – kobik

+0

@kobik: конечно, вам нужно перейти в браузере на URL-адрес и дождаться загрузки HTML-кода, прежде чем вы сможете восстановить его содержимое. –

Смежные вопросы