Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
День добрый.
Delphi XE5, Windows 8,10.
Есть небольшой код парсинга HTML страницы. При выводе данных по выбранному тэгу в Мемо - теряется большая русская Р,
вместо нее ромбик со знаком вопроса. так на всех сайтах с UTF-8... Подскажите, пожалуйста, что не так и где не так?
Для запроса страницы использую TidHTTP, для парсинга IHTMLDocument2.

+


Картинка с другого сайта.



Код запроса страницы:

procedure TForm1.bGetURLClick(Sender: TObject);
  var Content : TStringStream;
	V     : OleVariant;
	sURL  : string;
begin
  try
    Content := TStringStream.Create;	//	создаем поток

    DocHTML :=	coHTMLDocument.Create as IHTMLDocument2;
    DocHTML.designMode := 'on';
    sURL    :=	edURL.Text;

    try
        IdHTTP1.Get(sURL, Content);
        V     := VarArrayCreate([0, 0], varVariant);
        V[0]  := Content.DataString;
        DocHTML.write(PSafeArray(TVarData(V).VArray));

        mText.Lines.Add('HTML получен!');
    finally
        Content.Free;
    	end;

  except
  on E: exception do
    Application.MessageBox(PChar('Ошибка в procedure TForm1.bGetURLClick: ' +#13#13+ E.Message), '!!!', mb_IconStop);
  end;
end;



Код обработки тэга и показ в Мемо:

procedure TForm1.bGetTagClick(Sender: TObject);
  var	TagA	: IHTMLElementCollection;
	Element : IHTMLElement;
	sTag, sTXT : string;
	i, iCount : integer;
begin
  if DocHTML <> nil then
  begin
    try
        sTag  :=  edTag.Text;	//  тэг который надо искать
        TagA  :=  DocHTML.all.tags(sTag) as IHTMLElementCollection;	//	коллекция по выбранному тэгу

        iCount := TagA.length - 1;	//  кол-во элементов

        mText.Clear;
        mText.Lines.BeginUpdate;	//  отключаем контроль на Мемо

        //	бежим по коллекции и заносим стоки в Мемо
	for i := 0 to iCount do
        begin
          Element  :=	TagA.item(i, 0) as IHTMLElement;

	  case cbNoTag.Checked of
	    False  : sTXT := element.innerHTML;  //  с тэгами
	    True   : sTXT := element.innerText;	  //  без тэгов
          end;

          mText.Lines.Add(UTF8ToString(sTXT));		 //  перекодировка и добавление строки в Мемо
        end;

	mText.Lines.EndUpdate;    //	включаем контроль на Мемо
    except
    on E: exception do
	Application.MessageBox(PChar('Ошибка в procedure TForm1.bGetTagClick: ' +#13#13+ E.Message), '!!!', mb_IconStop);
    end;
  end;
end;




К сообщению приложен файл. Размер - 62Kb


Сообщение было отредактировано: 1 июн 21, 13:06
1 июн 21, 13:13    [22329798]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
sasha27,

Картинка с другого сайта.

К сообщению приложен файл. Размер - 56Kb
1 июн 21, 13:16    [22329799]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
sasha27,

	    False  : sTXT := element.innerHTML;  //  с тэгами
	    True   : sTXT := element.innerText;	  //  без тэгов


По документации BSTR это уже Unicode строка, причём из WCHAR. Ты уверен что её надо перекодировать из UTF8?..
1 июн 21, 16:14    [22329923]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
alekcvp
sasha27,

	    False  : sTXT := element.innerHTML;  //  с тэгами
	    True   : sTXT := element.innerText;	  //  без тэгов



По документации BSTR это уже Unicode строка, причём из WCHAR. Ты уверен что её надо перекодировать из UTF8?..


Без перекодировки Мемо отображает "кракозябры"... ((

Новости
Видео
Прямой эфир
Новости
Видео
Прямой эфир

Сообщение было отредактировано: 1 июн 21, 16:30
1 июн 21, 16:38    [22329937]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
sasha27,

Попробуй тогда sTXT объявить как RawByteString.
1 июн 21, 16:53    [22329954]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
alekcvp,

Заменил на RawByteString, та же песня, большая русская Р не отображается, на некоторых страницах теряются кавычки двойные )).

Это относится к страницам с UTF8 кодировкой, где "charset=windows-1251" все нормально... ((


ссылка на проект... если не трудно кому, может глянут

Сообщение было отредактировано: 1 июн 21, 17:06
1 июн 21, 17:12    [22329964]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53472

Отлаживайся. Такое впечатление, что эти сайты либо что-то неправильно отдают, либо бы
где-то портишь память. Твои пляски с бубном вокруг вариантов при получении выглядят
чертовски подозрительно.

Posted via ActualForum NNTP Server 1.5

1 июн 21, 17:21    [22329971]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
Dimitry Sibiryakov,

Использую модуль MSHTML в uses и IHTMLDocument2 интерфейс.
Дмитрий, посмотрите, пожалуйста, под спойлером procedure TForm1.bGetTagClick так 5 строчек всего...

Выбираю что запрашивать - с тегами или без тэгов текст, потом конвертация с добавление строки в Мемо...
фсе... и такая вот ситуевина...
1 июн 21, 17:53    [22329992]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
sasha27,

Вам надо определить кодировку страницы сразу после её получения и в случае UTF8 сделать вот так:
V[0] := UTF8Decode(Content.DataString);


Потому что в вашем случае Content ничего не знает о кодировке и по-умолчанию всегда считает её Win-1251, откуда и растут ноги у глюков.

Сообщение было отредактировано: 1 июн 21, 18:07
1 июн 21, 18:14    [22330012]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
alekcvp
Member

Откуда:
Сообщений: 2878


К сообщению приложен файл. Размер - 10Kb
1 июн 21, 18:17    [22330015]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
alekcvp,

Спасибо тебе, добрый человек!
Сам бы не дошёл
1 июн 21, 18:45    [22330027]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53472

sasha27
под спойлером *procedure TForm1.bGetTagClick* так 5 строчек всего...

И в этих пяти строчках три ошибки... Не надо использовать TStringStream - он может портить
содержимое кривым перекодированием. Не надо плясать с вариантами - они вообще непредсказуемы.

Неужели так трудно посмотреть глазками на принятое содержимое страницы на каждой стадии
чтобы определить где оно портится?..

Posted via ActualForum NNTP Server 1.5

1 июн 21, 18:49    [22330029]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
Dimitry Sibiryakov,

Дмитрий, спасибо за направление ))
При всем уважении, alekcvp помог кратко и ёмко )), с «засечкой» на полях!
Всем здоровья и успехов!
1 июн 21, 22:18    [22330112]     Ответить | Цитировать Сообщить модератору
 Re: Delphi, парсинг страницы, UTF8ToString - теряется русская Р  [new]
sasha27
Member

Откуда: Москва
Сообщений: 187
alekcvp,

Все понял, все отложилось ))
Спасибо!
1 июн 21, 22:20    [22330113]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить