1.用QtCreator的帮助手册,问题出在udp的发送函数 在发送之前将QString转成QByteArray,
2,默认的是采用toLatin1()转换的,所以接受端无论按GB2312还是UTF-8怎么转都是乱码。而在主函数里又不能设定全局的setCodecForCStrings的编码方式。所以我最初尝试在send函数发送前,setCodecForCStrings()设成UTF-8,然后发送完后再将setCodecForCStrings()设成GB2312,发现只有第一次能发送中文,对端能正常显示。以后软键盘就乱码了。问题的根源在这里
3,默认的是Latin-1格式,也就是将codec设成0就恢复到默认状态了。用这个思路改,应该也能成功!
其实,问题的症结在toAscii()的时候依据的编码格式,能够在toAscii()之前,将QString转成UTF-8不就好了么。
将这句话QByteArray sendByteArray = sendStr.toAscii();改成QByteArray sendByteArray = sendStr.toUtf8().data();UDP的显示消息模块不变,依然用
QTextCodec *tutf=QTextCodec::codecForName("UTF-8");
QString dataStr =tutf->toUnicode(data);还用UTF-8来解析,这样就能正常接收消息并显示中文了!
代码:
void UdpThread::read()
{
QByteArray datagram;
QString dataStr;
QTextCodec *tutf=QTextCodec::codecForName("GB2312");
do {
datagram.resize(sUdpSocket->pendingDatagramSize());
sUdpSocket->readDatagram(datagram.data(), datagram.size());
dataStr =tutf->toUnicode(datagram);
} while (sUdpSocket->hasPendingDatagrams());
if(!dataStr.isEmpty())
{
qDebug()<<"ok";
}
else
{
qDebug()<<"datagram is empty";
}
qDebug()<<dataStr;
processdata(dataStr);
}