C++Builder XE8下IDHttp的post返回中文乱码问题

GoingMerry 2015-08-26 02:06:03
我再C++Builder XE8中 弄个例子 想用IDHttp给后台发送请求, 看相关资料 说XE8里的String都是UnicodeString 因此定义的变量都改成UnicodeString了 但是Post返回的结果中 中文有乱码 主要代码如下
TStrings *RData = new TStringList();
RData->Clear();
RData->Add(L"ENCODE=000000200000008b0000009");
System::UnicodeString str = (idhttp1->Post(http, RData));
Memo2->Lines->Add(L"返回结果:" + (str));

有返回报文 说明地址和请求报文没问题 但是返回报文里的中文都是乱码 (“返回结果”显示正常,报文里的中文为乱码,乱码如1楼图)

请问如何解决?
...全文
979 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxfame 2016-09-19
  • 打赏
  • 举报
回复
我找到解决方法了,使用tstringstream作为返回类型,部分代码参考:
TStringList *ParamStr = new TStringList;
TStringStream *ResponseStream=new TStringStream("",65001);
//...中间代码省略
IdHTTP1->Post(url, ParamStr,ResponseStream);
Memo1->Text=ResponseStream->DataString;
ResponseStream->DataString里面的中文不是乱码了! 解决方法参考自http://blog.sina.com.cn/s/blog_549f50ec01019cgc.html 和http://blog.csdn.net/syndicater/article/details/17302857
wxfame 2016-09-19
  • 打赏
  • 举报
回复
我在提交微信刷卡支付时遇到同样的问题了,求解。接口详情:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1,post后返回的错误代码描述那栏是乱码。
GoingMerry 2015-12-08
  • 打赏
  • 举报
回复
最终也没解决问题。。然后做了base64的加密处理 进行交互的 结贴吧。。感谢各位帮忙
helyna 2015-09-02
  • 打赏
  • 举报
回复
Tstringlist.create("",tencoding.utf8)
GoingMerry 2015-09-01
  • 打赏
  • 举报
回复
引用 26 楼 kfrght 的回复:
RData->Add(L"ENCODE=000000200000008b0000009");

你的这段代码非常的奇怪,它似乎已经知道了将接收的字符串流所使用的编码?你的服务器端是不是也对字符串进行了类似的处理?

对字符串进行头部标识码的处理,似乎是BCB2009和2010才需要做的,XE系列根本不需要,你的服务器端是用2010或2009写的?

如果方便的话,将你用我给你的代码取得的数据流存成文件,然后用16进制显示出来抓图发上来看看,要包含头部

我是用的post 发送的报文 不太会用get 顺便问下 用get怎么给后台地址发送报文? 这个图是用post 数据流的文件 16进制显示的。。不知道是不是你要的。。
GoingMerry 2015-09-01
  • 打赏
  • 举报
回复
引用 25 楼 kfrght 的回复:
你把 http 这个网址改成公网网站的网址,然后用我给你的办法测试,最好能把你的比较完整的代码发来看看,尤其是你的服务器端是什么开发的,用别的方法得到的数据正常吗?
非常感谢版主的耐心回答,服务器端 用的eclipse java写的 我试过 用BCB6 就可以获取正常 XE8就不行 ENCODE=000000200000008b000000 这个是客户端对报文做了加密处理 服务器端相应进行解密。
宝龙哥 2015-08-31
  • 打赏
  • 举报
回复
RData->Add(L"ENCODE=000000200000008b0000009");

你的这段代码非常的奇怪,它似乎已经知道了将接收的字符串流所使用的编码?你的服务器端是不是也对字符串进行了类似的处理?

对字符串进行头部标识码的处理,似乎是BCB2009和2010才需要做的,XE系列根本不需要,你的服务器端是用2010或2009写的?

如果方便的话,将你用我给你的代码取得的数据流存成文件,然后用16进制显示出来抓图发上来看看,要包含头部
宝龙哥 2015-08-31
  • 打赏
  • 举报
回复
你把 http 这个网址改成公网网站的网址,然后用我给你的办法测试,最好能把你的比较完整的代码发来看看,尤其是你的服务器端是什么开发的,用别的方法得到的数据正常吗?
宝龙哥 2015-08-31
  • 打赏
  • 举报
回复
引用 20 楼 xiehongxin 的回复:
我将32位转为64位读取文件时也出现过中文乱码情况,我解决办法是不要试图转换类,也不要另外申请内存。 TStringList *RData = new TStringList(); RData->Clear(); AnsiString str; RData->Text ="ENCODE=000000200000008b0000009"; str = (idhttp1->Post(http, RData)); Memo2->Lines->Add(L"返回结果:" + (str)); 你试这个。
加上这个是不是只改变了标识头部的编码方式?
引用 22 楼 GoingMerry 的回复:
[quote=引用 17 楼 kfrght 的回复:]


  TMemoryStream *T_LXBI;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  T_LXBI=new TMemoryStream();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  T_LXBI->Clear();
  delete T_LXBI;
  T_LXBI=NULL;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  T_LXBI->Clear(); // 使用前先清空流

  IdHTTP1->Get(http,T_LXBI); // 下载文件

  // 解决乱码问题的关键点在这里,把下面的这些一个一个的实验,看那个正常

  Memo1->Lines->LoadFromStream(T_LXBI);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::UTF8);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::UTF7);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::Unicode);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::Default);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::BigEndianUnicode);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::ASCII);
}
都试过了 全是乱码。。这是啥情况? 会不会是项目配置问题 或者系统问题? 之前看到一个帖子 楼主乱码 有人用相同代码测试 没有乱码[/quote] 这都不行?你的服务器端是什么写的?不会是传说中的超强利器XE自带的DataSnap吧?看样子不像,DataSnap的中文是?号,不是乱码
GoingMerry 2015-08-31
  • 打赏
  • 举报
回复
引用 21 楼 xiehongxin 的回复:
本版等级:T1 #20 得分:0 回复于: 2015-08-29 20:32:42 我将32位转为64位读取文件时也出现过中文乱码情况,我解决办法是不要试图转换类,也不要另外申请内存。 TStringList *RData = new TStringList(); RData->Clear(); AnsiString str; RData->Text ="ENCODE=000000200000008b0000009"; str = (idhttp1->Post(http, RData)); Memo2->Lines->Add("返回结果:" + (str));
还是乱码啊。。感谢回答
GoingMerry 2015-08-31
  • 打赏
  • 举报
回复
引用 17 楼 kfrght 的回复:


  TMemoryStream *T_LXBI;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  T_LXBI=new TMemoryStream();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  T_LXBI->Clear();
  delete T_LXBI;
  T_LXBI=NULL;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  T_LXBI->Clear(); // 使用前先清空流

  IdHTTP1->Get(http,T_LXBI); // 下载文件

  // 解决乱码问题的关键点在这里,把下面的这些一个一个的实验,看那个正常

  Memo1->Lines->LoadFromStream(T_LXBI);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::UTF8);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::UTF7);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::Unicode);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::Default);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::BigEndianUnicode);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::ASCII);
}
都试过了 全是乱码。。这是啥情况? 会不会是项目配置问题 或者系统问题? 之前看到一个帖子 楼主乱码 有人用相同代码测试 没有乱码
xiehongxin 2015-08-29
  • 打赏
  • 举报
回复
本版等级:T1 #20 得分:0 回复于: 2015-08-29 20:32:42 我将32位转为64位读取文件时也出现过中文乱码情况,我解决办法是不要试图转换类,也不要另外申请内存。 TStringList *RData = new TStringList(); RData->Clear(); AnsiString str; RData->Text ="ENCODE=000000200000008b0000009"; str = (idhttp1->Post(http, RData)); Memo2->Lines->Add("返回结果:" + (str));
xiehongxin 2015-08-29
  • 打赏
  • 举报
回复
我将32位转为64位读取文件时也出现过中文乱码情况,我解决办法是不要试图转换类,也不要另外申请内存。 TStringList *RData = new TStringList(); RData->Clear(); AnsiString str; RData->Text ="ENCODE=000000200000008b0000009"; str = (idhttp1->Post(http, RData)); Memo2->Lines->Add(L"返回结果:" + (str)); 你试这个。
宝龙哥 2015-08-29
  • 打赏
  • 举报
回复
还有一个极其少见的情况,就是用宽字符编码的字符串前面的标示位丢失,比如0xff,0xfe或0xef,0xbb,0xbf这样应该有的头部丢了
宝龙哥 2015-08-29
  • 打赏
  • 举报
回复
IdHTTP里面存储的是字节流,你给它什么它就存什么,不存在任何编码问题 出现编码问题有两个,一是,你发给IdHTTP的数据或者你从IdHTTP里面弄出数据给显示控件时设置的编码不对 二是,你用CppWebBrowser、WebBrowser之类的显示时,html文件中的<meta http-equiv="Content-Type" content="text/html; charset=utf-8">这样的地方指定的编码和你给CppWebBrowser提供的字符串的编码不一致
宝龙哥 2015-08-29
  • 打赏
  • 举报
回复


  TMemoryStream *T_LXBI;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  T_LXBI=new TMemoryStream();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  T_LXBI->Clear();
  delete T_LXBI;
  T_LXBI=NULL;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  T_LXBI->Clear(); // 使用前先清空流

  IdHTTP1->Get(http,T_LXBI); // 下载文件

  // 解决乱码问题的关键点在这里,把下面的这些一个一个的实验,看那个正常

  Memo1->Lines->LoadFromStream(T_LXBI);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::UTF8);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::UTF7);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::Unicode);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::Default);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::BigEndianUnicode);
  //Memo1->Lines->LoadFromStream(T_LXBI,TEncoding::ASCII);
}
GoingMerry 2015-08-28
  • 打赏
  • 举报
回复
引用 10 楼 draculamx 的回复:
UTF8String Over....
感谢回答 TStrings *RData = new TStringList(); RData->Clear(); RData->Add(L"ENCODE=0000002000“); System::UTF8String str = idhttp1->Post(http, RData); 这样么?还是乱码。。
draculamx 2015-08-28
  • 打赏
  • 举报
回复
UTF8String Over....
GoingMerry 2015-08-28
  • 打赏
  • 举报
回复
引用 12 楼 kfrght 的回复:
[quote=引用 9 楼 GoingMerry 的回复:] [quote=引用 7 楼 kfrght 的回复:] 这个在正常情况下,IdHTTP下载的东东本身并不存在因为IdHTTP下载本身而造成的编码的问题 而是,由于字符显示或字符容器控件本身造成的编码问题 你的这种情况,都是在数据载入或发出时使用TEncoding::UTF8之类的参数
那就是说 是我接收返回的 字符容易 有问题? TStrings *RData = new TStringList(); 这个不对?[/quote] 你的这个可以直接取,也可以用流,直接取得话: Memo1->Text=Utf8ToAnsi(IdHTTP1->Get( http ));//很多网页使用其它编码格式,显示时要转换一下,这里将utf-8转换成gb2312 还有一种方法如你的一样,或直接使用内存流 对于下载下来的字符串到底是什么编码格式的,一般的方法是逐个取出字符串进行码位的分析,我的一个程序是把所有编码列出来,由用户手动选择,暂时满足要求[/quote] Utf8ToAnsi找到了 大小写拼错了 结果还是乱码。。问号的那种乱码
GoingMerry 2015-08-28
  • 打赏
  • 举报
回复
引用 13 楼 kfrght 的回复:
你IdHTTP接收到的数据一点问题都没有,是你没有正确的指示显示控件该用什么编码来载入这些字符,或者说你编码转换那句出了问题
后台返回的应该是gb2312的 我也用流的方式读取了 代码如下 TStringStream *ss = new TStringStream(idhttp1->Post(http,RData), TEncoding::Unicode, true); 然后指定TEncoding 把能指定的编码方式都试了一遍 还都是乱码。 另外 Utf8ToAnsi这个我这提示没有这个函数 只有UTF8ToString 还有就是 您看我的理解对不对 就是说 后台返回给我的编码是GB2312 而post返回的数据是Unicoding的 所以我接收到的就是乱码 我需要接收到之后 将其转换成GB2312 的 就可以正常显示出来了 是这个意思吧?
加载更多回复(12)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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