Delphi Indy Отправка данных POST на кириллице

Я хочу отправить кириллические почтовые данные с помощью 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); ?>

есть ответ сайта


person TreantBG    schedule 19.07.2011    source источник
comment
Дубликат stackoverflow. ком/вопросы/6322442/   -  person mjn    schedule 19.07.2011
comment
тогда проблема была в других кириллических символах ????? теперь они что-то другое.   -  person TreantBG    schedule 20.07.2011


Ответы (3)


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

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

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

person Remy Lebeau    schedule 19.07.2011
comment
хорошо, я знаю, что ваше решение работает, но у меня есть определенные проблемы с моим delphi и моим indy10 .... он отправляет мне ошибку в .ContentTransfer Так что у меня к вам личная просьба. Можете ли вы скомпилировать мой небольшой проект и дать мне ссылку для загрузки исполняемого файла? это ссылка на мой проект - mediafire.com/?zlblrkciri8fvzk - person TreantBG; 20.07.2011
comment
Свойство ContentTransfer было недоступно в версии Indy (10.5.7), поставляемой с Delphi XE. Это относительно недавнее добавление в 10.5.8, которое доступно в Indy's SVN. - person Remy Lebeau; 20.07.2011
comment
Я не пытался обновить свой Embarcadero RAD Studio XE 3 РАЗА... и я не могу этого сделать... Пожалуйста, не могли бы вы сделать то, о чем я вас прошу? Можете ли вы скомпилировать мой проект и отправить мне ссылку для его загрузки? - person TreantBG; 20.07.2011
comment
@TreantBG: Инструкции находятся на веб-сайте Инди. С чем именно у вас проблемы? Предоставление вам предварительно скомпилированного исполняемого файла (и нет, я не буду делать это за вас) было бы довольно бесполезным, если вы не можете впоследствии перекомпилировать программу самостоятельно, когда это необходимо. - person Remy Lebeau; 22.07.2011

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

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

person kludg    schedule 19.07.2011
comment
хорошо, но я хочу не расшифровывать их, а правильно отправлять. у меня нет доступа к веб-сайту, на который я хочу отправить данные POST. - person TreantBG; 20.07.2011
comment
Если PHP не декодирует их автоматически, то ваш PHP-скрипт должен декодировать их вручную, иначе вы должны указать Indy отключить его кодирование, как я показал вам ранее. - person Remy Lebeau; 20.07.2011

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

FContentTransfer := sContentTransferQuotedPrintable;

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

person mjn    schedule 19.07.2011
comment
да в файле эта строчка правильная. Но у моего Embarcadero RAD Studio XE есть проблема. Когда я хочу увидеть файл (Ctrl + щелчок), появляется ошибка Невозможно найти файл IdMulitpartFormData.pas, и приложение все еще работает... - person TreantBG; 20.07.2011