Delphi Indy发送Cyrillic编码的POST数据

3

我希望用Delphi和Indy 10发送Cyrillic字符集的数据。我知道如何发送数据,但是当我发送写有Cyrillic字符集的内容时,POST数据响应会出现一些编码符号。 以下是我的代码:

  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


如何使用 Indy10 Delphi 发送 Cyrillic 数据 - mjn
那么问题是其他的,西里尔文符号变成了“?????”现在变成了其他东西。 - TreantBG
3个回答

4
你正在告诉 AddFormField() 使用UTF-8编码文本值,然后使用MIME的quoted-printable编码进行传输时,UTF-8八位字节还会被额外编码。对于文本数据,默认设置为TIdFormDataField.ContentTransfer属性的quoted-printable编码。在PHP输出中看到了quoted-printable文本。如果想要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文件的链接?这是我的项目链接-http://www.mediafire.com/?zlblrkciri8fvzk - TreantBG
ContentTransfer 属性在 Delphi XE 附带的 Indy(10.5.7)版本中不可用。它是在 10.5.8 中较近期的添加,可以在 Indy 的 SVN 中获取。 - Remy Lebeau
我试图升级我的Embarcadero RAD Studio XE 3次...但我做不到。请问你能帮我完成吗?你能编译我的项目并发送下载链接给我吗? - TreantBG
@TreantBG:说明在Indy网站上。你具体有什么困难?如果你在需要时无法自行重新编译程序,那么给你预编译的可执行文件是没什么用的(而且不,我不会为你这样做)。 - Remy Lebeau

1

你的“编码符号”是UTF8编码的西里尔字母。你可以使用对应编码表手动解码它们。例如

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


很好但我不想解码它们,而是以正确的方式发送它们。我无法访问要发送POST数据的网站。 - TreantBG
如果PHP不能自动解码它们,那么你的PHP脚本需要手动解码它们,否则你必须告诉Indy禁用它的编码,就像我之前展示的那样。 - Remy Lebeau

0

PHP服务器以quoted printable格式接收UTF-8编码的字符串。要验证这一点,请检查应用程序是否在IdMulitpartFormData中触发了此行:

FContentTransfer := sContentTransferQuotedPrintable;

不过PHP方面应该能够处理这种传输模式。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接