• 8007阅读
  • 8回复

[提问]通过QtcpSocket传输汉字,如何能让接受方接受到的也是汉字。 [复制链接]

上一主题 下一主题
离线cdutherbert
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-24
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
通过QTcpsocket来传输信息。传输实现可以传英文。但是当传输汉字的时,接收方出现乱码。请问该如何解决?谢谢。
离线dbzhang800

只看该作者 1楼 发表于: 2009-11-24
确保两边的编码一致!
离线cdutherbert
只看该作者 2楼 发表于: 2009-11-24
谢谢。。。
离线318065268
只看该作者 3楼 发表于: 2009-11-26
这个问题我遇到过。一般接收汉字需要使用QString类,比如从QTextEdit上获取输入的文本。但传输数据的时候需要使用QByteArray。这样就免不了将QSring转化为QByteArray。除了常见的toAscii()函数外,还必须做这样的设置:
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
如此才能保证在做中文编码的时候选择的codec版本是正确的。

至于二楼提到的编解码的问题,不建议使用,比如QDataStream,QTextStream,都不要用。做简单的工作时使用它们比不使用更麻烦,尤其对初学者来说。况且使用QByteArray基本都能搞定,也不费什么事。使用编解码的好处就在于,我这里传输一个QPixmap对象过去,那边能够直接解析成QPixmap对象去用。如果有这种需要的,可以参考这些编解码方面的内容。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线dbzhang800

只看该作者 4楼 发表于: 2009-11-26
引用第3楼318065268于2009-11-26 16:01发表的  :
这个问题我遇到过。一般接收汉字需要使用QString类,比如从QTextEdit上获取输入的文本。但传输数据的时候需要使用QByteArray。这样就免不了将QSring转化为QByteArray。除了常见的toAscii()函数外,还必须做这样的设置:
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
如此才能保证在做中文编码的时候选择的codec版本是正确的。
至于二楼提到的编解码的问题,不建议使用,比如QDataStream,QTextStream,都不要用。做简单的工作时使用它们比不使用更麻烦,尤其对初学者来说。况且使用QByteArray基本都能搞定,也不费什么事。使用编解码的好处就在于,我这里传输一个QPixmap对象过去,那边能够直接解析成QPixmap对象去用。如果有这种需要的,可以参考这些编解码方面的内容。



从 QString 转成 QByteArray 就是一个编解码的问题 (encode and decode)
而QString和QByteArray之间转化的 toAscii 等等函数就是编解码(Unicode和ascii、gbk、utf8等之间的转化)用的。

QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); 这个语句更明确表明是与 codec 相关的。但是用这个的话,必须两台机子的locale完全一致才有用!!
离线318065268
只看该作者 5楼 发表于: 2009-11-26
不喜欢争这些概念,能增长或交流知识最重要。
我所说的编解码主要指QDataStream这些。
OK,楼上一贯正确。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线wd007

只看该作者 6楼 发表于: 2009-11-26
我做过Udp的,接收数据的时候用过QByteArray,比较好用。
Tcp的好像也是用QByteArray。

中间确实需要转换,比如:
QByteArray data;
QString msg = data.data();
listContent->addItem(msg.left(data.size()));
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线swift19221
只看该作者 7楼 发表于: 2011-11-18
哈哈,学习了
离线banqiaoren

只看该作者 8楼 发表于: 2011-12-05
windows默认gb18030编码,linux默认utf-8编码

QTextCodec * pcodec  = NULL;
pcodec = QTextCodec::codecForName("GB18030");
if (NULL == pcodec)
{
     return;
}

QString strData = QString::null;
strData = pcodec->toUnicode("传递汉字内容");

pTcpSocket->write(strData);
快速回复
限100 字节
 
上一个 下一个