1 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
你所展示的看起來(lái)像 MIME 的quoted-printable
編碼,其中非 ASCII/保留字節(jié)八位字節(jié)以=HH
十六進(jìn)制格式編碼。TIdMultiPartFormDataStream
默認(rèn)情況下,會(huì)以帶引號(hào)的可打印格式對(duì)文本字段進(jìn)行編碼。=E0=E8=EC=F2=F9
是字節(jié)序列的 QP 編碼形式$E0 $E8 $EC $F2 $F9
,它是以'àèìòù'
Latin-1 (ISO-8859-1) 字符集編碼的文本。
PHP 不支持提交中的Content-Transfer-Encoding
標(biāo)頭multipart/form-data
(請(qǐng)參閱此),因此它不會(huì)自動(dòng)為您解碼 QP 編碼。因此,您必須:
在 PHP 腳本代碼中手動(dòng)解碼 QP 編碼。
TIdMultipartFormDataStream
通過將TIdFormDataField.ContentTransfer
屬性設(shè)置為'8bit'
而不是默認(rèn)值來(lái)禁用應(yīng)用 QP 編碼'quoted-printable'
(請(qǐng)注意,RFC 7578不贊成Content-Transfer-Encoding
在multipart/form-data
通過 HTTP 提交的文件中使用標(biāo)頭,但TIdMultipartFormDataStream
尚未更新以解決該問題1)。1:注意 - 該
TIdFormDataField.ContentTransfer
屬性可以設(shè)置為空字符串,這將禁止Content-Transfer-Encoding
發(fā)送標(biāo)頭,但它也會(huì)根據(jù)RFC 2045 第 6.1 節(jié)將文本作為 7 位 US-ASCII 發(fā)送,所以不要使用它選項(xiàng),如果您需要發(fā)送包含非 ASCII 字符的文本。
另外,請(qǐng)注意,Delphi 2007 不是啟用 Unicode 的 Delphi 版本(即String
= AnsiString
),這就是您的文本以 Latin-1 格式發(fā)布的原因。在 Unicode 之前的版本中,按原樣TIdMultiPartFormDataStream
傳輸AnsiString
數(shù)據(jù),因此您負(fù)責(zé)以AnsiString
所需的字節(jié)編碼(例如 UTF-8)對(duì)發(fā)布的s進(jìn)行預(yù)編碼。
試試這個(gè):
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 關(guān)注
- 200 瀏覽
添加回答
舉報(bào)