Проблемы кодировки с Libcurl

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблемы кодировки с Libcurl

Сообщение Art!P » 09.01.2014 16:31:49

Ковыряю код целый день, страницу у гугла выпрашиваю, вместо русских символов вопросы
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Cthreads, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  libcurl,unixtype,LazUTF8;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

type
  TMyTr = class(TThread)
  private
    str:UnicodeString;
    procedure Show;
  protected
    procedure Execute; override;
   public
    Constructor Create(CreateSuspended : boolean);
  end;

var
  Form1: TForm1;
  mytr:Tmytr;

implementation

{$R *.lfm}

{ TForm1 }

Function DoWrite(Ptr : Pointer; Size : size_t; nmemb: size_t; Data : Pointer) : size_t;cdecl;
begin
  Result:=TStream(Data).Write(Ptr^,Size*nmemb);
end;

procedure TMyTr.Execute;
var
  f : TFileStream;
  URL : Pchar = 'https://www.google.ru/';
  Curl : pCurl;
  data:TMemoryStream;
  code:CURLcode;
  list:Pcurl_slist = nil;
begin
  data:=TMemoryStream.Create();
  Try
    Curl:= curl_easy_init;
    if Curl<>nil then
      begin
      curl_easy_setopt(Curl,CURLOPT_URL,[URL]);
      curl_easy_setopt(Curl,CURLOPT_TIMEOUT,[5]);
      list:=curl_slist_append(list,'Accept: text/html; charset=UTF-8');
      list:=curl_slist_append(list,'Accept-Charset: UTF-8');
      curl_easy_setopt(Curl,CURLOPT_HTTPHEADER,[list]);
      curl_easy_setopt(Curl,CURLOPT_WRITEFUNCTION,[@DoWrite]);
      curl_easy_setopt(Curl,CURLOPT_WRITEDATA,[Pointer(data)]);
      code := curl_easy_perform(Curl);
      curl_easy_cleanup(Curl);
      SetString(str, data.Memory, data.Size);
      Synchronize(@show);
      end;
  Finally
    data.Free;
  end;
  Terminate;
end;

constructor TMyTr.Create(CreateSuspended : boolean);
begin
  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end;

procedure TMyTr.Show;
begin
//  Form1.Memo1.Text := UTF8Encode(str);
//  Form1.Memo1.Text := UTF8Decode(str);
//  Form1.Memo1.Text := Utf16ToUtf8(str);
//  Form1.Memo1.Text := Utf8ToSys(str);
  Form1.Memo1.Text := Utf8ToAnsi(str);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  mytr := Tmytr.Create(false);
end;

end.

Гугл меня извлек уже. Видимо я нуб :shock:
Не могу страницу перекодить, помогите
Аватара пользователя
Art!P
новенький
 
Сообщения: 27
Зарегистрирован: 28.07.2012 14:37:53

Re: Проблемы кодировки с Libcurl

Сообщение SSerge » 09.01.2014 18:31:00

Что-то не пойму смысла совмещения строки в кодировке UTF16 с потоком, содержащим UTF8...
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Проблемы кодировки с Libcurl

Сообщение Art!P » 09.01.2014 18:51:03

да это я пытался использовать разные варианты "а вдруг?"

Может в MemoryStream проблема?
Последний раз редактировалось Art!P 09.01.2014 19:01:42, всего редактировалось 1 раз.
Аватара пользователя
Art!P
новенький
 
Сообщения: 27
Зарегистрирован: 28.07.2012 14:37:53

Re: Проблемы кодировки с Libcurl

Сообщение SSerge » 09.01.2014 18:59:09

Art!P
Вы с этим http://sirserge.altai.info/articles/?id=45 на всякий случай ознакомьтесь. Возможно, прямой взаимосвязи с вашей проблемой и нет, но как только появляются маркированные строки (UnicodeString тоже маркированная кодовой страницей AnsiString), так сразу появляются проблемы скрытой конверсии. Может быть, как раз на них ловитесь. Более вряд ли чем помогу, ибо вникать серьезно желания нет и язык этот уже давненько не трогал. :oops:
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Проблемы кодировки с Libcurl

Сообщение Art!P » 09.01.2014 19:55:28

Едрёная кочерыга! Во всем виноват гугл.
Читал документ по ссылке SSerge, в голове мысль появилась.
Проблема в самой кодировке, гугл отдает страницу в формате WIN-1251 :evil: это не смотря на мой аксепт.
Сохранил поток в файл (data.SaveToFile('test.html')), открыл обычным браузером в юникоде вопросами, за то открылся в 1251 :?
Стоит Wireshark, но SSL соединения он не расшифровывает, давно бы разобрался, еще и в самом документе нет намека на кодировку.
Перехватил юзер-агент хрониума добавил
Код: Выделить всё
list:=curl_slist_append(list,'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)');

Теперь отдает в юникоде. Логика вне стандартов.
Это опустошает

ПС. день убит успешно
Аватара пользователя
Art!P
новенький
 
Сообщения: 27
Зарегистрирован: 28.07.2012 14:37:53


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 245

Рейтинг@Mail.ru