Delphi Indy 后编码和 PHP

从 php 脚本返回的字符串被编码。


我在 delphi 2007 和 Indy 10.6 中针对 php 脚本的 http 帖子有问题。php 脚本包含: header ("Content-Type: application / json; charset = UTF-8"); 德尔福部分是这样的:


  data: = TStringList.Create;


  dati.Values ['id']: = '6';

  dati.Values ['name']: = 'àèìòù';


  lParams: = TIdMultiPartFormDataStream.Create;

  cont: = 0;

  try

    try

      url: = 'someurl';

      while cont <= data.Count-1 do

      begin

        lParams.AddFormField (data.Names [cont], data.Values [data.Names [cont]]);

        Inc (cont);

      end;

      Response: = IdHTTP1.Post (url, lParams);

    except

      on E: Exception do

      Response: = E.ClassName + ':' + E.Message;

    end;

  finally

    lParams.Free;

    IdHTTP1.Disconnect;

  end;

  Result: = Response;

响应包含应保存在 mysql 数据库中的内容,其 varchar 字段在字段和 php 回显中都声明为 utf8-general-i,但是,它们返回:= E0 = E8 = EC = F2 = F9


我尝试使用 UTF8Encode (dati.Values [data.Names [cont]]) 进行编码,我尝试将 UTF-8 字符集传递给 AddFormField,但从未返回字符串 àèìòù。


我究竟做错了什么?


哈士奇WWW
浏览 176回答 1
1回答

宝慕林4294392

你所展示的看起来像 MIME 的quoted-printable编码,其中非 ASCII/保留字节八位字节以=HH十六进制格式编码。TIdMultiPartFormDataStream默认情况下,会以带引号的可打印格式对文本字段进行编码。=E0=E8=EC=F2=F9是字节序列的 QP 编码形式$E0 $E8 $EC $F2 $F9,它是以'àèìòù'Latin-1 (ISO-8859-1) 字符集编码的文本。PHP 不支持提交中的Content-Transfer-Encoding标头multipart/form-data(请参阅此),因此它不会自动为您解码 QP 编码。因此,您必须:在 PHP 脚本代码中手动解码 QP 编码。TIdMultipartFormDataStream通过将TIdFormDataField.ContentTransfer属性设置为'8bit'而不是默认值来禁用应用 QP 编码'quoted-printable'(请注意,RFC 7578不赞成Content-Transfer-Encoding在multipart/form-data通过 HTTP 提交的文件中使用标头,但TIdMultipartFormDataStream尚未更新以解决该问题1)。1:注意 - 该TIdFormDataField.ContentTransfer属性可以设置为空字符串,这将禁止Content-Transfer-Encoding发送标头,但它也会根据RFC 2045 第 6.1 节将文本作为 7 位 US-ASCII 发送,所以不要使用它选项,如果您需要发送包含非 ASCII 字符的文本。另外,请注意,Delphi 2007 不是启用 Unicode 的 Delphi 版本(即String=&nbsp;AnsiString),这就是您的文本以 Latin-1 格式发布的原因。在 Unicode 之前的版本中,按原样TIdMultiPartFormDataStream传输AnsiString数据,因此您负责以AnsiString所需的字节编码(例如 UTF-8)对发布的s进行预编码。试试这个:url := 'someurl';try&nbsp; data := TStringList.Create;&nbsp; try&nbsp; &nbsp; data.Values ['id']: = '6';&nbsp; &nbsp; data.Values ['name'] := UTF8Encode('àèìòù'); // <-- omit UTF8Encode() in D2009+...&nbsp; &nbsp; lParams := TIdMultiPartFormDataStream.Create;&nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; for cont := 0 to data.Count-1 do&nbsp; &nbsp; &nbsp; begin&nbsp; &nbsp; &nbsp; &nbsp; lParams.AddFormField(data.Names[cont], data.ValueFromIndex[cont], 'utf-8').ContentTransfer := '8bit';&nbsp; &nbsp; &nbsp; end;&nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; Response := IdHTTP1.Post(url, lParams);&nbsp; &nbsp; &nbsp; finally&nbsp; &nbsp; &nbsp; &nbsp; IdHTTP1.Disconnect;&nbsp; &nbsp; &nbsp; end;&nbsp; &nbsp; finally&nbsp; &nbsp; &nbsp; lParams.Free;&nbsp; &nbsp; end;&nbsp; finally&nbsp; &nbsp; data.Free;&nbsp; end;except&nbsp; on E: Exception do&nbsp; &nbsp; Response := E.ClassName + ':' + E.Message;end;Result := Response;
打开App,查看更多内容
随时随地看视频慕课网APP