qt socket通信传递中文字符串怎么处理?

雨嫣然 2013-01-04 04:23:20
客户端:
ui->plainTextEdit(文本编辑器)里边有中文英文还有日期,相当于日志文件。

// 不是简单的“中文”字符串,是放在QString变量里的,转换成QByteArray后就是另外一种乱码。。。。
QString str = ui->plainTextEdit->toPlainText( );
QByteArray byData;//要发送给服务器端的数据包
QByteArray byToken = QString( "FutureInternet" ).toAscii( );
QByteArray byBody = "select log table";

// 通过这个转换似乎丢了些数据。还是乱码
QString text = QString::fromLocal8Bit( (const char *)&str, str.length() );
qDebug() << text << endl;
byBody.append( text );
quint32 nLength = byToken.length( ) +
sizeof ( quint32 ) +
byBody.length( );

nLength = htonl( nLength );

byData.append( byToken );
byData.append( ( const char* ) &nLength,
sizeof ( quint32 ) );
byData.append( byBody );

clientThread->PostDataEvent( byData );

现在要把这个中文字符串write到服务器端,然后把这些数据insert到数据库中。要怎样处理呢?服务端接受到的是乱码,数据库的添加语句也执行不了。
...全文
891 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
_GZ 2013-01-17
  • 打赏
  • 举报
回复
引用 9 楼 zhengtingyin 的回复:
你们说的我都试过了,还是不行哈! 这是我的解决办法: 1.在main函数里我之前就加了一句QTextCodec::setCodecForTr( QTextCodec::codecForLocale() ); 现在再加一句QTextCodec::setCodecForCStrings( QTextCodec::codecForLocale() );这句是会对QStri……
楼主,十分感谢你。 没看到你的帖我差点死掉...一直没解决这个问题。但是我有个地方和你不一样 QTextCodec *code= QTextCodec::codecForName("GBK");我用GBK直接不显示,转化为QByteArray直接把我的中文忽略掉了,所以我最后用UTF-8就解决问题了。十分感谢你~
四分之一炷香 2013-01-06
  • 打赏
  • 举报
回复
引用 6 楼 zhengtingyin 的回复:
引用 4 楼 lanhy999 的回复:UTF8之后BASE64 比较保险,无论tcp还是http都可以 QByteArray bystr = str.toUtf8(); QByteArray bystr2 = bystr.toBase64(); qDebug() << bystr << endl; qDebug() << by……
接收端收到首先要base64解码,解码之后是uitf-8格式bytearray,然后再调用 QString QString::fromUtf8 ( const char * str, int size = -1 )
雨嫣然 2013-01-06
  • 打赏
  • 举报
回复
你们说的我都试过了,还是不行哈! 这是我的解决办法: 1.在main函数里我之前就加了一句QTextCodec::setCodecForTr( QTextCodec::codecForLocale() ); 现在再加一句QTextCodec::setCodecForCStrings( QTextCodec::codecForLocale() );这句是会对QString类型的变量进行自动转换成本地的设置类型(一般都是中文哈)。 2.在发送方要把字符串转换成字节序: // "GB18030" || "GBK" || "GB2312"这三种都可以转换中文,其他的用在这里不是乱码就是程序崩溃。 QTextCodec *code= QTextCodec::codecForName("GBK"); QString strtest = "你好Test"; QByteArray bytest = code->fromUnicode( strtest ); 传输时时用QByteArray类型传送的。 3.在接收方把接收到得QByteArray类型的变量通过QString的构造函数转换成QString类型 QByteArray bylog = byEventParam.mid( str.length() );// 接收到的字符串 QString strlog1( bylog ); 这样我的就中文就成功显示了,添加进数据库也正确了。 但是我还有个问题不明白,我的QT(windows下的)有时会出现,在运行状态和调试状态的运算结果不一致: 比如今天的,在运行状态我要传输的中文字符串str,用qDebug() << "str" << str << endl;打印出来是正常的中文; 在调试状态下打印出来的就是乱码。qDebug() << 显示在 应用程序输出 那里正常是打印不出中文的。
雨嫣然 2013-01-05
  • 打赏
  • 举报
回复
引用 4 楼 lanhy999 的回复:
UTF8之后BASE64 比较保险,无论tcp还是http都可以
QByteArray bystr = str.toUtf8(); QByteArray bystr2 = bystr.toBase64(); qDebug() << bystr << endl; qDebug() << bystr2 << endl; 是这样吗?还是乱码啊?还是到服务端要怎么转换吗? 不同种类的乱码。从文本编辑框中获得的内容 "Óû§ zhangfang ÓÚ ÐÇÆÚÁù Ò»Ô 5 12:16:45 2013 ½øÐÐÁËˢС£ " str.toUtf8();之后的内容 "??¡§??¡¤ zhangfang ?o? ????????- ?????? 5 12:16:45 2013 ¨¨??¨¨???o???¡¤??¡ã??? " bystr.toBase64()之后的内容 "55So5oi3IHpoYW5nZmFuZyDkuo4g5pif5pyf5YWtIOS4gOaciCA1IDEyOjE2OjQ1IDIwMTMg6L+b6KGM5LqG5Yi35paw44CCCgo="
雨嫣然 2013-01-05
  • 打赏
  • 举报
回复
引用 3 楼 moxiaomomo 的回复:
在传输数据之前测试时确定数据是没问题的?qDebug() << text << endl; 同时,楼主是否考虑大端小端的读取方式了?
大端小端是quint32的数据类型考虑的。字符串不用的啊。 客户端这边没有正确输出中文来。好像说是QT对中文这块处理不好。是怎样也不知道!! 我现在不知道应该把它先转化成中文再传递,还是传递后在服务端转成中文?还是都可以! 然后要怎样转化???
四分之一炷香 2013-01-05
  • 打赏
  • 举报
回复
UTF8之后BASE64 比较保险,无论tcp还是http都可以
moxiaomomo 2013-01-05
  • 打赏
  • 举报
回复
在传输数据之前测试时确定数据是没问题的?qDebug() << text << endl; 同时,楼主是否考虑大端小端的读取方式了?
雨嫣然 2013-01-05
  • 打赏
  • 举报
回复
引用 1 楼 jinjianxinxh 的回复:
建议楼主先转换为某种编码在传输,如转换为UTF-8 传递之后在解码
QByteArray byData;//要发送给服务器端的数据包 QByteArray byToken = QString( "FutureInternet" ).toAscii( ); QByteArray byBody = "select log table"; //QString str2 = str.toLocal8Bit(); QByteArray bystr = str.toUtf8(); //QString text = QString::fromLocal8Bit( (const char *)&str, str.length() ); //qDebug() << text << endl; 我之前是转换成Local8Bit,传递过去还是乱码,用了这个toUtf8()。还是不行啊!! 我服务器端是: QByteArray& byEventParam = pEvent->GetEventParam( );// 读到的客户端传送的数据 if( byEventParam.isEmpty() ) return; QString str = "select log table"; QByteArray bylog = byEventParam.mid( str.length() );// 去掉"select log table" qDebug() << bylog << endl; QString strlog = ( QString )bylog; QByteArray bylog2 = strlog.toUtf8(); qDebug() << bylog2 << endl; //用下面这个也没有对。 // QString text = QString::fromLocal8Bit( (const char *)&bylog, bylog.length() ); // qDebug() << text << endl; 是不是我服务器端解析错了呢?
乔巴好萌 2013-01-05
  • 打赏
  • 举报
回复
QByteArray byToken = QString( "FutureInternet" ).toAscii( ); 应该是toUtf8() 传送的时候 尽量转换成const char * buffer的传送 如果是UDP的话 服务器直接select超时收 如果是TCP短连接的话 服务器循环收 一直收到0字节为止 收发字节数如果一致的话 服务端解码就行了 上网http里面一样有中文的 没问题 如果楼主再觉得有问题 就转换成const char * ,然后base64一下发送出去。。。 再不行 你就直接发送xml 讲你的数据包作为xml的text发送出去 Qt做收发没问题的
jinjianxinxh 2013-01-04
  • 打赏
  • 举报
回复
建议楼主先转换为某种编码在传输,如转换为UTF-8 传递之后在解码

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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