delphi 2010 idhttp使用TIdMultiPartFormDataStream post 中文问号,该怎么处理
delphi 2010 idhttp使用TIdMultiPartFormDataStream post 中文问号
delphi 2010 idhttp使用TIdMultiPartFormDataStream post时,服务器收到的中文都是问号(???????),使用sniffer抓包发现发送的也是问号,确认是TIdMultiPartFormDataStream的问题,请问高手如果解决?
delphi版本为2010,使用delphi7时没问题.
------解决方案--------------------
这个,应该是宽字节的问题
解决的话,BS中传输中文参数里,先将中文用URLEncode编码,服务端接收到之后解码
就像百度搜索中文,比如“我是菜鸟”
http://www.baidu.com/baidu?word=%C4%E3%CA%C7%B2%CB%C4%F1
------解决方案--------------------
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;
------解决方案--------------------
URLEncode编码
URLDecode解码
------解决方案--------------------
想了一个办法,基本上也就是将TIdMultiPartFormDataStream里的宽字节字符串数据流转换成单字节的
------解决方案--------------------
等我回家了把代码给你吧,留个邮箱!
delphi 2010 idhttp使用TIdMultiPartFormDataStream post时,服务器收到的中文都是问号(???????),使用sniffer抓包发现发送的也是问号,确认是TIdMultiPartFormDataStream的问题,请问高手如果解决?
- Delphi(Pascal) code
PostData := TIdMultiPartFormDataStream.Create; PostData.AddFormField('url', ''); PostData.AddFormField('tag', '电影'); idhttp1.Post(posturl, PostData,strm);
delphi版本为2010,使用delphi7时没问题.
------解决方案--------------------
这个,应该是宽字节的问题
解决的话,BS中传输中文参数里,先将中文用URLEncode编码,服务端接收到之后解码
就像百度搜索中文,比如“我是菜鸟”
http://www.baidu.com/baidu?word=%C4%E3%CA%C7%B2%CB%C4%F1
------解决方案--------------------
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;
------解决方案--------------------
URLEncode编码
URLDecode解码
------解决方案--------------------
想了一个办法,基本上也就是将TIdMultiPartFormDataStream里的宽字节字符串数据流转换成单字节的
------解决方案--------------------
等我回家了把代码给你吧,留个邮箱!