qtcpsocket调用write和read函数写数据乱码问题解决方法

参考以下博客QTcpSocket通信乱码解决方法

http://blog.csdn.net/zouhao619/article/details/7100752


qtcpsocket写中文会乱码,在写入前和读出后进行处理一下就可以正常显示,如先调fromlocal8Bit,再将数据转成utf8,同时长度也需要转成utf8后再获取

QString str = QString::fromLocal8Bit("服务器接收到数据,给客户端发送数据");
socket->write(str.toUtf8(),str.toUtf8().size());


读时读取出来后,先转为utf8,再从utf8转为local8Bit,即能正常输出中文。

qint64 bytes = socket->bytesAvailable();
QString str = socket->read(bytes);
printf("read data[%s]\n", QString::fromUtf8(str.toUtf8()).toLocal8Bit().data());

### 回答1: QTcpSocketread函数是用来从套接字读取数据的。该函数有两个重载版本:一个是读取指定长度的数据,另一个是读取所有可用的数据。 第一个版本的函数原型如下: qint64 QTcpSocket::read(char *data, qint64 maxSize) 其,data是一个指向缓冲区的指针,maxSize是要读取的最大字节数。该函数会尝试从套接字读取maxSize个字节的数据,并将其存储到data指向的缓冲区。如果读取成功,函数返回实际读取的字节数;如果读取失败,函数返回-1。 第二个版本的函数原型如下: QByteArray QTcpSocket::readAll() 该函数会读取套接字所有可用的数据,并将其存储到一个QByteArray对象。如果没有可用的数据函数返回一个空的QByteArray对象。 ### 回答2: QTQTcpSocket类是一个基于TCP协议的socket通信类,它提供了一系列的方法和信号槽,可以实现客户端和服务器之间的网络通信。其重要的一个方法就是read函数,对于QTcpSocket类实例,read函数主要作用是从socket缓冲区读取数据read函数的原型如下: ```cpp qint64 QTcpSocket::read(char *data, qint64 maxSize); ``` 其,data为缓存区,maxSize为最大读取的字节数。read函数会返回实际读取的字节数,如果没有数据可读,则返回-1。 read函数是一个同步阻塞函数,它会在读取到maxSize字节之后自动阻塞等待,直到收到足够的数据或者发生错误。因此,在使用read函数之前,必须保证socket已连接成功,并且有数据可读。 read函数调用时需要注意以下几点: 1. 由于read函数是一个同步阻塞函数,如果读取到的数据较大,会导致主线程一直阻塞,因此应该将read函数放到独立的线程执行,或者使用QIODevice::readyRead()信号槽实现异步读取数据。 2. read函数会阻塞等待数据到来,因此在使用时必须确定已经有数据可读,否则会因等待数据而导致程序阻塞。 3. read函数读取的数据是字节流,而非字符串,因此需要在读取数据之后根据具体应用场景进行转换。 总之,QTcpSocketread函数是一个非常重要且常用的网络通信函数,在使用时需要根据具体应用场景进行调用,并注意其阻塞和异步的特性。 ### 回答3: QTcpSocketread函数是用于从套接字读取数据函数。它有多个重载形式,可以读取指定长度的数据、直到读取到指定分隔符的数据、或者读取所有可用数据函数的返回值是成功读取的字节数,不同的重载形式会返回不同类型的数据。 当我们需要从QTcpSocket读取数据时,可以通过以下步骤使用read函数: 1. 在连接套接字的readyRead信号调用read函数读取数据。 2. 根据读取到的数据进行相应的处理,如显示在界面上、存储到文件等。 需要注意的是,由于网络环境的不确定性和传输过程可能出现的错误,read函数不一定能读取到完整的数据,可能需要多次读取才能获取到全部数据。因此,在使用read函数时,需要对读取过程进行循环判断,确保读取到了期望的数据。 另外,QTcpSocket也提供了一些其他的函数用于读取数据,如readAll、readLine等,这些函数都是基于read函数的封装,在特定情况下使用更加方便。需要根据具体的需求选择合适的函数,以便实现数据的可靠读取和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值