Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi, парсинг страницы, UTF8ToString - теряется русская Р / 14 сообщений из 14, страница 1 из 1
01.06.2021, 13:13
    #40074690
sasha27
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
День добрый.
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
01.06.2021, 13:16
    #40074691
sasha27
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi, парсинг страницы, UTF8ToString - теряется русская Р
sasha27,

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

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



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

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




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


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

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

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

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

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


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

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

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

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



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

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

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

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

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

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


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