如何正确获取IdHTTP1.Response.RawHeaders.Text内的中文

一个符号存世 2017-08-20 10:24:31
我需要使用delph 10.2获取IdHTTP1.Response.RawHeaders.Text内的Content-Disposition字段的值,但是此值是含有中文的,在10.2的平台上不知道如何转化,求教


我测试代码为下载一个文件,此文件名处于返回的http header中,文件名含中文,需要得到这个文件名
首先在D7中测试,代码为:
Str:=BDC.SysSite+'download/product';
jo := SO('{"productid":"'+productid+'","type":"'+TypeName+'"}');
TStream := TMemoryStream.Create;
TJ := TStringList.Create;
TJ.Append(utf8Encode(jo.AsString));
IdHTTP1.Post(Str,TJ,TStream);
TJ.Free;
ProcessTxt.Lines.Add(UTF8Decode(IdHTTP1.Response.RawHeaders.Text));
返回的头部信息为
Server: nginx/1.4.6 (Ubuntu)
Date: Sun, 20 Aug 2017 11:22:47 GMT
Content-Type: application/zip
Content-Length: 273003
Connection: close
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description, x-requested-with, content-type, reqUserId, reqUserSession, bizCode, reqBizGroup, reqUserSession, bizsign, timestamp, token, ManageGroupType, ManageGroupId, reqtype, fileMd5
Access-Control-Allow-Methods: POST
Access-Control-Allow-Methods: GET
Access-Control-Allow-Methods: DELETE
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: *
Content-Disposition: attachment;filename=XC.2017.008.003_净水器(T3平台新增
Filemd5: 983c6fda8a3542123d8131f06a0d9a29
==========获取成功,得到文件名==========

接下来在10.2的IDE里,代码
jo:=SO();
jo.S['productid']:=productid;
jo.S['type']:=dltypeTxt.Value;
MS := TMemoryStream.Create;
stream := TStringStream.Create(jo.AsString, TEncoding.UTF8);
FWSInfo.IdHTTP1.Post( BDC.SysSite+'download/product', stream,MS);
stream.Free;
dllogTxt.Lines.Add(FWSInfo.IdHTTP1.Response.RawHeaders.Text);
返回的头部信息为:
Server: nginx/1.4.6 (Ubuntu)
Date: Sun, 20 Aug 2017 11:14:03 GMT
Content-Type: application/zip
Content-Length: 273003
Connection: close
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description, x-requested-with, content-type, reqUserId, reqUserSession, bizCode, reqBizGroup, reqUserSession, bizsign, timestamp, token, ManageGroupType, ManageGroupId, reqtype, fileMd5
Access-Control-Allow-Methods: POST
Access-Control-Allow-Methods: GET
Access-Control-Allow-Methods: DELETE
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: *
Content-Disposition: attachment;filename=XC.2017.008.003 “这里是乱码” T3 “这里是乱码”
Filemd5: 983c6fda8a3542123d8131f06a0d9a29
==========获取失败==========
所以中文要如何转换
...全文
2368 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr Dang 2017-12-19
  • 打赏
  • 举报
回复

TEncoding.Default
应该是这个 ,不行 再换下其他编码试试
doloopcn 2017-09-18
  • 打赏
  • 举报
回复
引用 10 楼 hzken0137 的回复:
stream := TStringStream.Create(jo.AsString); 这样的试过了,和 stream := TStringStream.Create(jo.AsString, TEncoding.UTF8); 一样的,返回的都是乱码
换个重装个电脑城版GHOST版操作系统和DELPHI
一个符号存世 2017-09-18
  • 打赏
  • 举报
回复
哎,没有合适的答案啊
一个符号存世 2017-09-13
  • 打赏
  • 举报
回复
stream := TStringStream.Create(jo.AsString); 这样的试过了,和 stream := TStringStream.Create(jo.AsString, TEncoding.UTF8); 一样的,返回的都是乱码
doloopcn 2017-09-12
  • 打赏
  • 举报
回复
引用 8 楼 hzken0137 的回复:
[quote=引用 7 楼 doloopcn 的回复:] Str:=BDC.SysSite+'download/product'; jo := SO('{"productid":"'+productid+'","type":"'+TypeName+'"}'); ** TStream := TMemoryStream.Create; TJ := TStringList.Create; ** TJ.Append(utf8Encode(jo.AsString)); IdHTTP1.Post(Str,TJ,TStream); 没有上机测试过 估计是这**的两行的问题,详细查一下POST函数的参数问题,不要手工定义TSTREAM代码页试试 不要对任何参数进行任何代码转换或代码加工、限制 try it
上面的这段是D7的代码没有问题的,我这边是在XE10.2里出了问题 jo:=SO(); jo.S['productid']:=productid; jo.S['type']:=dltypeTxt.Value; MS := TMemoryStream.Create; stream := TStringStream.Create(jo.AsString, TEncoding.UTF8); FWSInfo.IdHTTP1.Post( BDC.SysSite+'download/product', stream,MS); stream.Free; 这段有问题[/quote] stream := TStringStream.Create(jo.AsString, TEncoding.UTF8);//估计这段吧,将TEncoding.UTF8设置为空吧
一个符号存世 2017-09-12
  • 打赏
  • 举报
回复
引用 7 楼 doloopcn 的回复:
Str:=BDC.SysSite+'download/product'; jo := SO('{"productid":"'+productid+'","type":"'+TypeName+'"}'); ** TStream := TMemoryStream.Create; TJ := TStringList.Create; ** TJ.Append(utf8Encode(jo.AsString)); IdHTTP1.Post(Str,TJ,TStream); 没有上机测试过 估计是这**的两行的问题,详细查一下POST函数的参数问题,不要手工定义TSTREAM代码页试试 不要对任何参数进行任何代码转换或代码加工、限制 try it
上面的这段是D7的代码没有问题的,我这边是在XE10.2里出了问题 jo:=SO(); jo.S['productid']:=productid; jo.S['type']:=dltypeTxt.Value; MS := TMemoryStream.Create; stream := TStringStream.Create(jo.AsString, TEncoding.UTF8); FWSInfo.IdHTTP1.Post( BDC.SysSite+'download/product', stream,MS); stream.Free; 这段有问题
doloopcn 2017-09-11
  • 打赏
  • 举报
回复
Str:=BDC.SysSite+'download/product'; jo := SO('{"productid":"'+productid+'","type":"'+TypeName+'"}'); ** TStream := TMemoryStream.Create; TJ := TStringList.Create; ** TJ.Append(utf8Encode(jo.AsString)); IdHTTP1.Post(Str,TJ,TStream); 没有上机测试过 估计是这**的两行的问题,详细查一下POST函数的参数问题,不要手工定义TSTREAM代码页试试 不要对任何参数进行任何代码转换或代码加工、限制 try it
  • 打赏
  • 举报
回复
多试试 AnsiToUtf8
一个符号存世 2017-09-07
  • 打赏
  • 举报
回复
引用 4 楼 doloopcn 的回复:
引用: IdURI; 使用: TidURI.URLDecode(MyHttp.Get(TIdURI.URLEncode(uploadstr))); //换成在你程序中 ProcessTxt.Lines.Add(TIdURI.URLDecode(IdHTTP1.Response.RawHeaders.Text));
非常感谢,但是依旧是一样的结果,一样的乱码 我纳闷死了,为啥D7下一点问题都没有,难道没有完美的转化方法吗?
doloopcn 2017-08-31
  • 打赏
  • 举报
回复
引用: IdURI; 使用: TidURI.URLDecode(MyHttp.Get(TIdURI.URLEncode(uploadstr))); //换成在你程序中 ProcessTxt.Lines.Add(TIdURI.URLDecode(IdHTTP1.Response.RawHeaders.Text));
一个符号存世 2017-08-23
  • 打赏
  • 举报
回复
能在具体点吗?我在D7是能正确获取IdHTTP1.Response.RawHeaders.Text的内容,换成D10.2就不行了,要如何操作?
doloopcn 2017-08-22
  • 打赏
  • 举报
回复
IdHTTP本身就带EnCode 和 DeCode 两个函数 不要使用其它方法了——》网上的贴子,我测试了很多也很久,总是不能达到100%没有乱码,用自带的,没有出现过乱码。
一个符号存世 2017-08-21
  • 打赏
  • 举报
回复
没有人遇到过这种问题吗?

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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