powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi, парсинг страницы, UTF8ToString - теряется русская Р
14 сообщений из 14, страница 1 из 1
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074690
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый.
Delphi XE5, Windows 8,10.
Есть небольшой код парсинга HTML страницы. При выводе данных по выбранному тэгу в Мемо - теряется большая русская Р,
вместо нее ромбик со знаком вопроса. так на всех сайтах с UTF-8... Подскажите, пожалуйста, что не так и где не так?
Для запроса страницы использую TidHTTP, для парсинга IHTMLDocument2.







Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Код запроса страницы:

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;




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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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;



...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074691
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27,

...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074766
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27,

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



По документации BSTR это уже Unicode строка, причём из WCHAR. Ты уверен что её надо перекодировать из UTF8?..
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074779
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
sasha27,

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




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


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

Новости
Видео
Прямой эфир
Новости
Видео
Прямой эфир
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074794
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27,

Попробуй тогда sTXT объявить как RawByteString.
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074804
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

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

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


ссылка на проект... если не трудно кому, может глянут
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074809
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлаживайся. Такое впечатление, что эти сайты либо что-то неправильно отдают, либо бы
где-то портишь память. Твои пляски с бубном вокруг вариантов при получении выглядят
чертовски подозрительно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074821
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

Выбираю что запрашивать - с тегами или без тэгов текст, потом конвертация с добавление строки в Мемо...
фсе... и такая вот ситуевина...
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074835
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27,

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



Потому что в вашем случае Content ничего не знает о кодировке и по-умолчанию всегда считает её Win-1251, откуда и растут ноги у глюков.
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074837
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074849
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Спасибо тебе, добрый человек!
Сам бы не дошёл
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074850
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27под спойлером *procedure TForm1.bGetTagClick* так 5 строчек всего...

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

Неужели так трудно посмотреть глазками на принятое содержимое страницы на каждой стадии
чтобы определить где оно портится?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074899
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Дмитрий, спасибо за направление ))
При всем уважении, alekcvp помог кратко и ёмко )), с «засечкой» на полях!
Всем здоровья и успехов!
...
Рейтинг: 0 / 0
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
    #40074900
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Все понял, все отложилось ))
Спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi, парсинг страницы, UTF8ToString - теряется русская Р
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]