Qt5发送http get请求,服务端接收中文乱码

·孺儒 发布于 2017/01/04 12:31
阅读 2K+
收藏 0
代码如下:
void HttpTest::testGet(){

       QNetworkAccessManager* manager = new QNetworkAccessManager(this);
       QNetworkRequest request;
       request.setUrl(QUrl("http://127.0.0.1:5678/zzjfnew/test.jsp?xmlData=<DATA><SBBH>10000001</SBBH><PPZH>测试</PPZH><FLAG>1</FLAG>      </DATA>"));
       QNetworkReply* reply = manager->get(request);
  }
在服务端接收到的数据如下:  “xmlData:<DATA><SBBH>10000001</SBBH><PPZH>娴??</PPZH><FLAG>1</FLAG></DATA>”,服务端用的是GBK编码。在程序里试过各种 qt解决中文乱码的方法都不行,跪求解决方法……
加载中
0
好远
好远
http://blog.csdn.net/li_jian_xing/article/details/47609621 这个试了没?
·孺儒
·孺儒
这个……您能给讲下或截图什么的吗,我在新疆,cdsn不能上……
0
quanwei9958
quanwei9958
urlencode,urldecode 两边处理一下
·孺儒
·孺儒
服务端不是Qt写的,我这边加密后,服务端就收不到了……
0
raindropxx
raindropxx
先把XML的内容加密一下呗。。。
·孺儒
·孺儒
是url.toPercentEncoding 这种的吗?
0
東條・スペンサー・咲
東條・スペンサー・咲

典型的编码乱码问题。返回的内容应该是QByteArray类型。需要使用QTextCodec将其转换成Unicode。

0
東條・スペンサー・咲
東條・スペンサー・咲
首先,使用QTextCodec获取GBK的编码,通过codecForName可以获取。然后,正常get。get完毕后,readAll()获取全部内容。得到一个QByteArray,然后通过GBK编码的TextCodec类的toUnicode获取改编码的UTF-8格式的正确QString。
0
·孺儒
·孺儒

引用来自“东条咲”的评论

首先,使用QTextCodec获取GBK的编码,通过codecForName可以获取。然后,正常get。get完毕后,readAll()获取全部内容。得到一个QByteArray,然后通过GBK编码的TextCodec类的toUnicode获取改编码的UTF-8格式的正确QString。
谢谢解答!
我get完毕后,在槽函数中是这样处理的
void Test::replyFinished(QNetworkReply* reply)
{
  if(reply->error() == QNetworkReply::NoError)
   {
        char m_receivedata[512];
        memset(m_receivedata,0,512);
        reply->read(m_receivedata,512);
        qDebug()<<QString::fromLocal8Bit(m_receivedata);
}
    可以正确打印出中文,现在的问题是我发送http请求时,服务端接收到的是乱码,服务端使用Java写的。
    再就是发现把链接直接用浏览器打开时,只有IE浏览器中文不乱码,其他浏览器,如谷歌、360等和程序里发送请求一样,也是乱码,这是什么原因呢?
0
東條・スペンサー・咲
東條・スペンサー・咲

发送请求收到乱码是因为Qt发送的时候,Qt直接使用QString的默认编码UTF-8发送的。目测服务器端是用GBK编码所以收到的是乱码,那么需要使用fromUnicode将UTF-8编码转化成GBK编码发送。

IE不显示乱码是因为这个脑残是使用系统默认编码进行解码的,Chrome和360(别用这种浏览器)的内核都是blink/webkit,估计设置的时候使用了UTF-8编码或者其它编码解析造成的乱码。

然后,这个槽函数虽然没写完,但是reply不要忘记deleteLater

0
·孺儒
·孺儒

引用来自“东条咲”的评论

发送请求收到乱码是因为Qt发送的时候,Qt直接使用QString的默认编码UTF-8发送的。目测服务器端是用GBK编码所以收到的是乱码,那么需要使用fromUnicode将UTF-8编码转化成GBK编码发送。

IE不显示乱码是因为这个脑残是使用系统默认编码进行解码的,Chrome和360(别用这种浏览器)的内核都是blink/webkit,估计设置的时候使用了UTF-8编码或者其它编码解析造成的乱码。

然后,这个槽函数虽然没写完,但是reply不要忘记deleteLater

嗯嗯,谢谢提醒。服务端编码是GBK,用Java写的。我这边先将UTF-8转化成GBK,再发送请求,应该就是这样吧:


QString string="http://127.0.0.1:5678/zzjfnew/test.jsp?xmlData=<DATA><SBBH>test</SBBH><PPZH>中文测试</PPZH><FLAG>1</FLAG></DATA>";
QByteArray encodedString=QTextCodec::codecForName("GBK")>fromUnicode(string);
 request.setUrl(QUrl(encodedString));
 reply = accessManager->get(request);

可是服务器收到的还是乱码:“xmlData:<DATA><SBBH>test</SBBH><PPZH>锟斤拷锟侥诧拷锟斤拷</PPZH><FLAG>1</FLAG></DATA>” 

0
東條・スペンサー・咲
東條・スペンサー・咲

引用来自“东条咲”的评论

发送请求收到乱码是因为Qt发送的时候,Qt直接使用QString的默认编码UTF-8发送的。目测服务器端是用GBK编码所以收到的是乱码,那么需要使用fromUnicode将UTF-8编码转化成GBK编码发送。

IE不显示乱码是因为这个脑残是使用系统默认编码进行解码的,Chrome和360(别用这种浏览器)的内核都是blink/webkit,估计设置的时候使用了UTF-8编码或者其它编码解析造成的乱码。

然后,这个槽函数虽然没写完,但是reply不要忘记deleteLater

引用来自“·孺儒”的评论

嗯嗯,谢谢提醒。服务端编码是GBK,用Java写的。我这边先将UTF-8转化成GBK,再发送请求,应该就是这样吧:


QString string="http://127.0.0.1:5678/zzjfnew/test.jsp?xmlData=<DATA><SBBH>test</SBBH><PPZH>中文测试</PPZH><FLAG>1</FLAG></DATA>";
QByteArray encodedString=QTextCodec::codecForName("GBK")>fromUnicode(string);
 request.setUrl(QUrl(encodedString));
 reply = accessManager->get(request);

可是服务器收到的还是乱码:“xmlData:<DATA><SBBH>test</SBBH><PPZH>锟斤拷锟侥诧拷锟斤拷</PPZH><FLAG>1</FLAG></DATA>” 

锟斤拷”是将UTF-8按照了GBK编码渲染的结果。在代码里出现问题的地方是QUrl的构造函数。

QUrl(QByteArray)这样的构造函数是不存在的,文档中QUrl的构造函数有:

QUrl()
QUrl(const QUrl &other)
QUrl(const QString &url, ParsingMode parsingMode = TolerantMode)
QUrl(QUrl &&other)

四种,毫无疑问,这里对应上了第三种构造函数。将GBK编码直接按照UTF-8编码读取,然后生成了URL。也就是说,数据在发出的那一刻就变成了“锟斤拷”。这个问题可以通过三种方式解决,虽然个人认为都不是理想的解决方案(用UTF-8重写服务端才是王道啊,笑):

第一种是通过QTextCodec::setCodecForCStrings静态函数改变全局的编码,但是,这个有点狠,估计要大改。所以不建议尝试。

第二种,我猜测Java是可以处理Percentage Encoding的,尝试将其转换为Percentage Encoding发送。不过不一定管用。

第三种,也是回答问题的时候想到的,QUrl存在这样一个静态函数:QUrl::fromEncoded。将request.setUrl(QUrl(encodedString))改为QUrl::fromEncoded(encodedString)试试看。说不定就可以了。

0
长安俞白眉
长安俞白眉

get请求url里面不要放中文,有的服务端url只支持iso8859-1编码 你怎么传都不行除非服务端该配置,所以post吧,你这种做法就算不乱码也不是很好的设计

返回顶部
顶部