1 回答
![?](http://img1.sycdn.imooc.com/5333a207000118af02200220-100-100.jpg)
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-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
= AnsiString
),这就是您的文本以 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;
- 1 回答
- 0 关注
- 175 浏览
添加回答
举报