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

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

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

Ответить
Аватара пользователя
Art!P
новенький
Сообщения: 27
Зарегистрирован: 28.07.2012 14:37:53
Контактная информация:

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

Сообщение Art!P »

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

Код: Выделить всё

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:
Не могу страницу перекодить, помогите
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Что-то не пойму смысла совмещения строки в кодировке UTF16 с потоком, содержащим UTF8...
Аватара пользователя
Art!P
новенький
Сообщения: 27
Зарегистрирован: 28.07.2012 14:37:53
Контактная информация:

Сообщение Art!P »

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

Может в MemoryStream проблема?
Последний раз редактировалось Art!P 09.01.2014 19:01:42, всего редактировалось 1 раз.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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

Сообщение Art!P »

Едрёная кочерыга! Во всем виноват гугл.
Читал документ по ссылке 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)');

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

ПС. день убит успешно
Ответить