Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.06.2018, 22:15
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
Вопрос html в memo, иероглифы за место русских букв

Есть определённый сайт. Хочу отслеживать новые темы на форуме. Получать уведомление в программе, если появилась новая тема.
Загружаю страничку в webbrowser, тяну html страницы в memo
Английские буквы отображаются нормально, а русские непонятными символми...

HTML в Memo получаю так:
Код:
function SaveHTML(Strings:TStrings;WB: TWebBrowser):boolean;
var
 PersistStream: IPersistStreamInit;
 MS: TMemoryStream;
 Stream: IStream;
 SaveResult: HRESULT;
begin
 PersistStream := WB.Document as IPersistStreamInit;
 MS := TMemoryStream.Create;
 Result:=false;
 try
  Stream := TStreamAdapter.Create(MS, soReference) as IStream;
  SaveResult := PersistStream.Save(Stream, True);
  if FAILED(SaveResult) then exit;
  Result:=true;
  MS.position:=0;
  Strings.LoadFromStream(MS);
 finally 
  MS.Free;
 end; 
end;



procedure TForm1.sSpeedButton1Click(Sender: TObject);
var Site:string;
begin
  Site := 'https://jahforum.org/forum/99-%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81-%D0%BE%D1%82%D0%B2%D0%B5%D1%82/';
  wb1.Navigate(Site);
   while Wb1.ReadyState<>4 do
  Application.ProcessMessages;
  SaveHTML(sMemo1.Lines,wb1);
end;

Пробовал делать так:
Код:
procedure TForm1.sSpeedButton2Click(Sender: TObject);
begin
sMemo1.Lines.Text := Utf8ToAnsi(sMemo1.Lines.Text);
end;

Результат тот же.
Еще пробовал Charset := RUSSAIN_CHARSET, не помогло.
Если что, сайт httpS
сам сайт jahforum org

ПОМОГИТЕЕЕЕЕ)

Ответить с цитированием
  #2  
Старый 20.06.2018, 00:45
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,252
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Вот это ничего не напоминает:
Код:
<meta charset="utf-8">
Т.е. тут вопрос только в том, как правильно перекодировать полученный HTML из UTF-8 в что-то понятное.

Вопрос 1. Какая версия Дельфи?
Вопрос 2. А не проще без twebbrowser обойтись? Тут недавно я приводил код загрузки странички через Indy. А то боюсь, что при выдирании из него может что-то испортиться.

PS.
Для Д2007 и более ранних - см https://stackoverflow.com/questions/...e-utf-8-base64
Для последней версии (Д10 Токио) - см http://docwiki.embarcadero.com/RADSt...rsion_Routines

Последний раз редактировалось lmikle, 20.06.2018 в 00:48.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Tech N9ne (20.06.2018)
  #3  
Старый 20.06.2018, 17:30
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Вот это ничего не напоминает:
Код:
<meta charset="utf-8">
Т.е. тут вопрос только в том, как правильно перекодировать полученный HTML из UTF-8 в что-то понятное.

Вопрос 1. Какая версия Дельфи?
Вопрос 2. А не проще без twebbrowser обойтись? Тут недавно я приводил код загрузки странички через Indy. А то боюсь, что при выдирании из него может что-то испортиться.

PS.
Для Д2007 и более ранних - см https://stackoverflow.com/questions/...e-utf-8-base64
Для последней версии (Д10 Токио) - см http://docwiki.embarcadero.com/RADSt...rsion_Routines

Ну вас.. ))) я новичок еще, и в инглише не бум бум толком))
Решил обойтись без Твеббраузера.

Delphi 7

Пытался с инди возится, гуглил, мучался, пробовал - не получается.
Скачал синапс, делаю гет запрос на гугл, получаю html
Делаю запрос на джа форум, получаю :

500GET / HTTP/1.1
Host: jahforum.org:443
Keep-Alive: 300
Connection: keep-alive


Длл-ки закинул в папку с программой, рядом с exe
Что за ?

Последний раз редактировалось Tech N9ne, 20.06.2018 в 17:32.
Ответить с цитированием
  #4  
Старый 20.06.2018, 21:12
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,252
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

ну, тебя, походу, вежливо послали, т.к. ты ходишь через http, т.е. dll-ки не подцепились.
Для Д7 желательно обновить Indy.
Повторю рабочий код для получения странички:
Код:
function ReadInternetPage(AUrl : String) : String;
var
  IdHTTP : TIdHTTP;
  Id_HandlerSocket : TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP := TIdHTTP.Create(Nil);
  Id_HandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  Try
    IdHTTP.Request.BasicAuthentication := False;
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';

    Id_HandlerSocket.SSLOptions.Mode := sslmClient;
    Id_HandlerSocket.SSLOptions.Method := sslvSSLv23;
    IdHTTP.IOHandler := Id_HandlerSocket;

    Result := IdHTTP.Get(FUrl);
  Finally
    Id_HandlerSocket.Free;
    IdHTTP.Free;
  End;
end;

Теперь про декодинг собственно.
Там по ссылке приведена функция декодирования. Вот она:
Код:
function UTF8ToWideString(const S: AnsiString): WideString;
var
  BufSize: Integer;
begin
  Result := '';
  if Length(S) = 0 then Exit;
  BufSize := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(S), Length(S), nil, 0);
  SetLength(result, BufSize);
  MultiByteToWideChar(CP_UTF8, 0, PANsiChar(S), Length(S), PWideChar(Result), BufSize);
end;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Tech N9ne (21.06.2018)
  #5  
Старый 21.06.2018, 00:26
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ну, тебя, походу, вежливо послали, т.к. ты ходишь через http, т.е. dll-ки не подцепились.
Для Д7 желательно обновить Indy.
Повторю рабочий код для получения странички:
Код:
function ReadInternetPage(AUrl : String) : String;
var
  IdHTTP : TIdHTTP;
  Id_HandlerSocket : TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP := TIdHTTP.Create(Nil);
  Id_HandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  Try
    IdHTTP.Request.BasicAuthentication := False;
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';

    Id_HandlerSocket.SSLOptions.Mode := sslmClient;
    Id_HandlerSocket.SSLOptions.Method := sslvSSLv23;
    IdHTTP.IOHandler := Id_HandlerSocket;

    Result := IdHTTP.Get(FUrl);
  Finally
    Id_HandlerSocket.Free;
    IdHTTP.Free;
  End;
end;

Теперь про декодинг собственно.
Там по ссылке приведена функция декодирования. Вот она:
Код:
function UTF8ToWideString(const S: AnsiString): WideString;
var
  BufSize: Integer;
begin
  Result := '';
  if Length(S) = 0 then Exit;
  BufSize := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(S), Length(S), nil, 0);
  SetLength(result, BufSize);
  MultiByteToWideChar(CP_UTF8, 0, PANsiChar(S), Length(S), PWideChar(Result), BufSize);
end;
Окей, спасибо!
Обновил инди, 10.
Вставляю первую функцию, ругается на
Код:
Result := IdHTTP.Get(FUrl);
Undeclared identifier: 'Furl'
Там должен быть сайт с которого хочу получить html ?
Пробовал вписывать туда гугл. А как мне получить в мемо html не пойму.
Код:
ReadInternetPage(memo1.lines.text);  // ?????
Если так, то в мемо пусто.

Скорее всего я что-то недопонял, будь добр разжуй мне пожалуйста )
Ответить с цитированием
  #6  
Старый 21.06.2018, 04:45
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,252
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Упс, код выдирал из своего исходника. Там это метод, а FUrl - поле этого метода, гда, да, хранится именно адрес странички. Поправь там в коде:
Код:
...
Result := IdHTTP.Get(AUrl);
...
А получить результат примерно так:
Код:
Memo1.Lines.Text := ReadInternetPage('www.google.com');
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Tech N9ne (21.06.2018)
  #7  
Старый 21.06.2018, 18:39
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Упс, код выдирал из своего исходника. Там это метод, а FUrl - поле этого метода, гда, да, хранится именно адрес странички. Поправь там в коде:
Код:
...
Result := IdHTTP.Get(AUrl);
...
А получить результат примерно так:
Код:
Memo1.Lines.Text := ReadInternetPage('www.google.com');
Ага, спасибо большое!!! HTML получаю, но со знаками вопроса вместо русских букв.
Пробовал функцию вашу:
Код:
 sMemo1.Lines.Text := UTF8ToWideString(sMemo1.Lines.Text)
Ничего не меняет.. Я опять туплю?
Ответить с цитированием
  #8  
Старый 21.06.2018, 19:50
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,252
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Ага, тупишь.
Я привел код, который выдрал из моего проекта. Сорь, забыл сказать, что он написан на Delphi 10 Tokyo, где String = UnicodeString, т.е. уже двухбайтовой. В смысле, где-то у тебя что-то теряется. Как вариант, нужно грузить страничку через поток (что бы ничего не терять) и декодировать полученный результат.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Tech N9ne (21.06.2018)
  #9  
Старый 22.06.2018, 06:13
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ага, тупишь.
Я привел код, который выдрал из моего проекта. Сорь, забыл сказать, что он написан на Delphi 10 Tokyo, где String = UnicodeString, т.е. уже двухбайтовой. В смысле, где-то у тебя что-то теряется. Как вариант, нужно грузить страничку через поток (что бы ничего не терять) и декодировать полученный результат.
Спасибо за помощь!!!

DELPHI 7
Сделал так:
Код:
 function MyUtf8ToAnsi(Source: String): String;
var
i: Cardinal;
c: Byte;
wc: Cardinal;
begin
  if Source = '' then
  begin
    Result := '';
    Exit;
  end;
    Result := '';
    i := 1;

    while (i <= length(Source)) do
    begin
     wc := Cardinal(Source[i]);
     Inc(i);
     if (wc and $80) <> 0 then //128+
       begin
        if i > length(Source) then
        begin
          Result:=Result + Char(wc);
          Exit; // incomplete multibyte char
        end;

           c := Byte(Source[i]);
           Inc(i);
        if (c and $C0) <> $80 then
          Result := Result + Char(wc)+Char(c)
        else
        Result := Result + WideChar(((wc and $3F) shl 6) or (c and $3F));
      end
      else
        Result := Result + WideChar(wc);
    end;
end;






procedure TForm1.sSpeedButton1Click(Sender: TObject);
var
  IdHTTP : TIdHTTP;
  Id_HandlerSocket : TIdSSLIOHandlerSocketOpenSSL;
  M:TStringStream;
begin

 IdHTTP := TIdHTTP.Create(Nil);
  Id_HandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  Try
    IdHTTP.Request.BasicAuthentication := False;
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';

    Id_HandlerSocket.SSLOptions.Mode := sslmClient;
    Id_HandlerSocket.SSLOptions.Method := sslvSSLv23;
    IdHTTP.IOHandler := Id_HandlerSocket;
    M:=TStringStream.Create('');
    IdHTTP.Get( 'тут сайт https' , M );  // сюда вписывать ссылку
    sMemo1.Lines.Text:=M.DataString;
     sMemo1.Lines.Text := MyUtf8ToAnsi(sMemo1.Lines.Text);
  Finally
    Id_HandlerSocket.Free;
    M.Free;
    IdHTTP.Free;
  End;


end;
Ответить с цитированием
  #10  
Старый 22.06.2018, 20:24
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,252
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

А чего сразу так не сделать?
Код:
    sMemo1.Lines.Text:=MyUtf8ToAnsi(M.DataString);
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Tech N9ne (23.06.2018)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2018

ВКонтакте   Facebook   Twitter