为了账号安全,请及时绑定邮箱和手机立即绑定

Delphi Indy 后编码和 PHP

Delphi Indy 后编码和 PHP

PHP
哈士奇WWW 2021-06-15 15:11:55
从 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,但从未返回字符串 àèìòù。我究竟做错了什么?
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

你所展示的看起来像 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-Encodingmultipart/form-data通过 HTTP 提交的文件中使用标头,但TIdMultipartFormDataStream尚未更新以解决该问题1)。

    1:注意 - 该TIdFormDataField.ContentTransfer属性可以设置为空字符串,这将禁止Content-Transfer-Encoding发送标头,但它也会根据RFC 2045 第 6.1 节将文本作为 7 位 US-ASCII 发送,所以不要使用它选项,如果您需要发送包含非 ASCII 字符的文本。

另外,请注意,Delphi 2007 不是启用 Unicode 的 Delphi 版本(即StringAnsiString),这就是您的文本以 Latin-1 格式发布的原因。在 Unicode 之前的版本中,按原样TIdMultiPartFormDataStream传输AnsiString数据,因此您负责以AnsiString所需的字节编码(例如 UTF-8)对发布的s进行预编码。

试试这个:

url := 'someurl';


try

  data := TStringList.Create;

  try

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

    data.Values ['name'] := UTF8Encode('àèìòù'); // <-- omit UTF8Encode() in D2009+...


    lParams := TIdMultiPartFormDataStream.Create;

    try

      for cont := 0 to data.Count-1 do

      begin

        lParams.AddFormField(data.Names[cont], data.ValueFromIndex[cont], 'utf-8').ContentTransfer := '8bit';

      end;


      try

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

      finally

        IdHTTP1.Disconnect;

      end;

    finally

      lParams.Free;

    end;

  finally

    data.Free;

  end;

except

  on E: Exception do

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

end;


Result := Response;


查看完整回答
反对 回复 2021-06-19
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信