|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
|||
|
|||
Вот это ничего не напоминает:
Код:
<meta charset="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
|
|||
|
|||
Цитата:
Ну вас.. ))) я новичок еще, и в инглише не бум бум толком)) Решил обойтись без Твеббраузера. 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
|
|||
|
|||
ну, тебя, походу, вежливо послали, т.к. ты ходишь через 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
|
|||
|
|||
Цитата:
Обновил инди, 10. Вставляю первую функцию, ругается на Код:
Result := IdHTTP.Get(FUrl); Там должен быть сайт с которого хочу получить html ? Пробовал вписывать туда гугл. А как мне получить в мемо html не пойму. Код:
ReadInternetPage(memo1.lines.text); // ????? Скорее всего я что-то недопонял, будь добр разжуй мне пожалуйста ) |
#6
|
|||
|
|||
Упс, код выдирал из своего исходника. Там это метод, а FUrl - поле этого метода, гда, да, хранится именно адрес странички. Поправь там в коде:
Код:
... Result := IdHTTP.Get(AUrl); ... Код:
Memo1.Lines.Text := ReadInternetPage('www.google.com'); |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Tech N9ne (21.06.2018)
|
#7
|
|||
|
|||
Цитата:
Пробовал функцию вашу: Код:
sMemo1.Lines.Text := UTF8ToWideString(sMemo1.Lines.Text) |
#8
|
|||
|
|||
Ага, тупишь.
Я привел код, который выдрал из моего проекта. Сорь, забыл сказать, что он написан на Delphi 10 Tokyo, где String = UnicodeString, т.е. уже двухбайтовой. В смысле, где-то у тебя что-то теряется. Как вариант, нужно грузить страничку через поток (что бы ничего не терять) и декодировать полученный результат. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Tech N9ne (21.06.2018)
|
#9
|
|||
|
|||
Цитата:
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
|
|||
|
|||
А чего сразу так не сделать?
Код:
sMemo1.Lines.Text:=MyUtf8ToAnsi(M.DataString); |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Tech N9ne (23.06.2018)
|