Delphi Indy 以西里尔文发送 POST 数据

Posted

技术标签:

【中文标题】Delphi Indy 以西里尔文发送 POST 数据【英文标题】:Delphi Indy Send POST data in Cyrillic 【发布时间】:2011-10-08 16:15:40 【问题描述】:

我想使用 indy 10 发送带有 delphi 的 Cyrillic 发布数据。 好的,我知道如何发送数据,但是当我发送书面或西里尔文时,发布数据响应带有一些编码符号。 有我的代码

  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); ?>

【问题讨论】:

重复***.com/questions/6322442/… 那么问题出在其他西里尔符号“?????”现在他们是别的东西了。 【参考方案1】:

您告诉 AddFormField() 使用 UTF-8 对文本值进行编码,然后在传输期间使用 MIME 的 quoted-printable 编码对 UTF-8 八位字节进行额外编码,这是 TIdFormDataField.ContentTransfer 属性的默认设置文本数据。您在 PHP 输出中看到了带引号的可打印文本。如果您希望 PHP 接收原始 UTF-8 八位字节,请将 TIdFormDataField.ContentTransfer 属性设置为 '8bit' 或 'binary',例如:

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

否则,您的 PHP 代码将不得不使用 quoted-printable-decode() 函数解码引用的可打印数据。

【讨论】:

我知道您的解决方案有效,但我的 delphi 和 indy10 存在某些问题....它在 .ContentTransfer 处向我发送错误所以我有个人要求。你能编译我的小项目并给我下载exe文件的链接吗?这是我的项目的链接 - mediafire.com/?zlblrkciri8fvzk ContentTransfer 属性在 Delphi XE 附带的 Indy (10.5.7) 版本中不可用。它是 10.5.8 中最近添加的,可在 Indy 的 SVN 中使用。 我没有尝试将 Embarcadero RAD Studio XE 升级 3 次......但我做不到。请问你能做到吗?你能编译我的项目并发给我下载链接吗? @TreantBG:说明在 Indy 的网站上。你到底有什么问题?如果您以后无法在需要时自己重新编译程序,给您一个预编译的可执行文件(不,我不会为您这样做)将毫无用处。【参考方案2】:

您的“编码符号”是 UTF8 编码的西里尔字母。您可以使用correspondent encoding table 手动解码它们。例如

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

【讨论】:

很好,但我不想解码它们,而是以正确的方式发送它们。我无法访问要发送 POST 数据的网站。 如果 PHP 没有自动解码它们,那么你的 PHP 脚本需要手动解码它们,否则你必须告诉 Indy 禁用它的编码,正如我之前向你展示的那样。【参考方案3】:

PHP 服务器以引用的可打印格式接收 UTF-8 编码字符串。要验证这一点,请检查应用程序是否命中 IdMulitpartFormData 中的这一行:

FContentTransfer := sContentTransferQuotedPrintable;

但是 PHP 端应该能够处理这种传输模式。

【讨论】:

是的,在文件中这一行是正确的。但是我的 Embarcadero RAD Studio XE 有一些问题。当我想查看文件(Ctrl + 单击)时,会出现错误“无法找到文件 IdMulitpartFormData.pas”,并且应用程序仍然可以工作......

以上是关于Delphi Indy 以西里尔文发送 POST 数据的主要内容,如果未能解决你的问题,请参考以下文章

delphi indy10 无法接收中文

无法使用Delphi通过Post打开Microsoft语音识别API

Delphi - Indy idMessage和idSMTP实现邮件的发送

Delphi XE IdTCPClient1 和 IdTCPServer1 数据的发送与接收(indy10)

使用 TLS 使用来自 DELPHI(Indy) 的 Gmail 传出 SMTP

delphi 7 下安装 indy 10.5.8 教程