Delphi Indy Отправить данные POST на кириллице - PullRequest
3 голосов
/ 19 июля 2011

Я хочу отправить данные поста кириллицей с помощью delphi, используя indy 10. Хорошо, я знаю, как отправлять данные, но когда я отправляю что-то написанное или кириллицу, ответ на данные поста имеет некоторые закодированные знаки.вот мой код

  http := TIDHttp.Create(nil);
  http.HandleRedirects := true;
  http.ReadTimeout := 5000;
  http.Request.ContentType:='multipart/form-data';
  param:=TIdMultiPartFormDataStream.Create;
  param.AddFormField('com','offers');
  param.AddFormField('op','new');
  param.AddFormField('MAX_FILE_SIZE','1048576');
  param.AddFormField('offer[secid]','34');
  param.AddFormField('offer[fullname]',UserArray[0], 'utf-8');
  param.AddFormField('offer[email]',UserArray[1]);
  param.AddFormField('offer[phone]',UserArray[2]);
  param.AddFormField('offer[url]',UserArray[4]);
  param.AddFormField('offer[city]','София', 'utf-8');
  param.AddFormField('offer[offer_buysell]','sell');
  param.AddFormField('offer[catid]','95');
  param.AddFormField('offer[title]',AdArray[0], 'utf-8');

  param.AddFile( 'image[0]', AdArray[3], 'image/jpeg' );

  param.AddFormField('offer[description]',AdArray[1], 'utf-8');
  param.AddFormField('offer[price]',AdArray[2]);
  param.AddFormField('offer[offer_end]','180');
  param.AddFormField('offer[email_onquestion]','1');
  param.AddFormField('iagree','1');
  param.AddFormField('btnSaveOffer','Изпрати', 'utf-8');
  valid:=true;
  url:='http://127.0.0.1/POST.php';
  text:=http.Post(url,param);

это ответ от моего POST.php

<?php print_r($_POST); ?>

there is the site response

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Вы говорите AddFormField() для кодирования текстовых значений с использованием UTF-8, а затем октеты UTF-8 дополнительно кодируются во время передачи с использованием кодирования MIME quoted-printable, которое является значением по умолчанию для свойства TIdFormDataField.ContentTransfer длятекстовые данные.Вы видите печатный текст в кавычках в своем выводе PHP.Если вы хотите, чтобы PHP вместо этого получал необработанные октеты UTF-8, задайте для свойства TIdFormDataField.ContentTransfer значение '8bit' или 'binary', например:

param.AddFormField('offer[fullname]',UserArray[0], 'utf-8').ContentTransfer := '8bit';

В противном случае ваш код PHP должен будет декодироватьданные для печати в кавычках с использованием функции quoted-printable-decode () .

1 голос
/ 19 июля 2011

Ваши "закодированные знаки" являются кириллицей в кодировке UTF8.Вы можете декодировать их вручную, используя соответствующую таблицу кодирования .Например

D0 A1 D0 BE D1 84 D0 B8 D1 8F -> София

0 голосов
/ 19 июля 2011

Сервер PHP получает строки в кодировке UTF-8 в формате для печати в кавычках. Чтобы убедиться в этом, проверьте, попадает ли приложение в эту строку в IdMulitpartFormData:

FContentTransfer := sContentTransferQuotedPrintable;

Однако сторона PHP должна иметь возможность обрабатывать этот режим передачи.

...