delphi 2010 idhttp使用TIdMultiPartFormDataStream post 中文问号

云朵儿呀 2011-11-22 11:47:21
delphi 2010 idhttp使用TIdMultiPartFormDataStream post时,服务器收到的中文都是问号(???????),使用sniffer抓包发现发送的也是问号,确认是TIdMultiPartFormDataStream的问题,请问高手如果解决?

PostData := TIdMultiPartFormDataStream.Create;
PostData.AddFormField('url', '');
PostData.AddFormField('tag', '电影');
idhttp1.Post(posturl, PostData,strm);

delphi版本为2010,使用delphi7时没问题.
...全文
1322 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
caixiuying2 2021-07-21
  • 打赏
  • 举报
回复

lParam.AddFormField('access_token', AToken).ContentTransfer := '8bit'; 在最后加ContentTransfer := '8bit'就解决了中文问题

u010598103 2021-07-07
  • 打赏
  • 举报
回复

url := url + HttpEncode(AnsiToUtf8('"'+myFieldItem.FCurrentValue+'"')) ;

Mit1208 2011-11-24
  • 打赏
  • 举报
回复
等我回家了把代码给你吧,留个邮箱!
云朵儿呀 2011-11-24
  • 打赏
  • 举报
回复
感谢LoveMit网友!
感谢各位热心网友!
问题已解决!
如有需要参考这里的解决方式:
http://topic.csdn.net/u/20111124/09/658d5e6d-a733-456a-8993-430da788a888.html?81801
Mit1208 2011-11-24
  • 打赏
  • 举报
回复
发过了,请查收邮箱!
云朵儿呀 2011-11-23
  • 打赏
  • 举报
回复
3楼的第一种方法也用过,也不行,服务器端是gb2312发过去也是中文乱码。希望实现方式为,像delphi7一样,发送去的中文到服务端不需要解码即可正确显示中文。
云朵儿呀 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lovemit 的回复:]
编码问题!
[/Quote]
记得你也遇到此问题,把TIdMultiPartFormDataStream.IdRead中的改为AppendString加TEncode.default,我试过,不行的,三个AppendString都改了。

也试过N多编码方式都不行,主要的目的是像delphi7一样,发送去的中文到服务端不需要解码即可正确显示中文。
云朵儿呀 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 delphiteacher 的回复:]
想了一个办法,基本上也就是将TIdMultiPartFormDataStream里的宽字节字符串数据流转换成单字节的
[/Quote]

是的,你的方法可以试试看。

另外,有朋友解决方法,
http://topic.csdn.net/u/20101020/20/6e47cd0b-4710-4ead-823b-8218c204315e.html#10
我却没成功。
DelphiTeacher 2011-11-23
  • 打赏
  • 举报
回复
想了一个办法,基本上也就是将TIdMultiPartFormDataStream里的宽字节字符串数据流转换成单字节的

[Quote=引用 7 楼 lhdebbs 的回复:]

3楼的第一种方法也用过,也不行,服务器端是gb2312发过去也是中文乱码。希望实现方式为,像delphi7一样,发送去的中文到服务端不需要解码即可正确显示中文。
[/Quote]
kaikai_kk 2011-11-22
  • 打赏
  • 举报
回复
URLEncode编码
URLDecode解码
Mit1208 2011-11-22
  • 打赏
  • 举报
回复
编码问题!
天行归来 2011-11-22
  • 打赏
  • 举报
回复
PostData := TIdMultiPartFormDataStream.Create;
替换成以下试试看:
var
postData: TStrings;
begin
...
postData := TStringList.Create;
postData.Add('tag=电影') ;
...
postData.Free;
end;

在和服务端servlet通讯时,我采用 THTTPReqResp 组件,url就是完整的URL地址,如果参数值有中文,需要用HttpEncode(AnsiToUtf8(paramValue))

var
FHttpReq: THTTPReqResp;
...

function TDataSync.GetResponseContent(url: string): string;
var
strStream: TStringStream;
begin
result := '';
strStream := TStringStream.Create('',TEncoding.UTF8);
try
FHttpReq.URL := url;
FHttpReq.Execute('',strStream);
result := strStream.DataString;
except
SetLastError('无效数据包,可能网络故障!');
end;
strStream.Free;
end;

如果是上传文件,我用 TIdHttp 控件。如下:
function TDataSync.UploadFile(fileName: string; var url: string): boolean;
var
sUrl: string;
idHttp: TIdHTTP;
strStream: TStringStream;
data: TIdMultiPartFormDataStream;
begin
result := false;
if not FileExists(fileName) then exit;

data := TIdMultiPartFormDataStream.Create();
data.AddFile('attachment',fileName,GetMIMETypeFromFile(fileName));
idHttp := TIdHTTP.Create(self);
strStream := TStringStream.Create('',TEncoding.UTF8);
try
sUrl := Format('%s%s',[FWebSite,URL_UPLOADFILE]);
idHttp.Post(sUrl,data,strStream);
result := GetResponseState(strStream.DataString);
url := AnalysisUploadFileUrl(strStream.DataString);
except
end;
idHttp.Free;
strStream.Free;
data.Free;
end;
DelphiTeacher 2011-11-22
  • 打赏
  • 举报
回复
这个,应该是宽字节的问题
解决的话,BS中传输中文参数里,先将中文用URLEncode编码,服务端接收到之后解码
就像百度搜索中文,比如“我是菜鸟”
http://www.baidu.com/baidu?word=%C4%E3%CA%C7%B2%CB%C4%F1
云朵儿呀 2011-11-22
  • 打赏
  • 举报
回复
高手进来一下吧,困扰好久了

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧