Qt入门学习小记——UDP收发解决汉字乱码问题

        本文主要记录Qt入门学习中的一些发现和问题,大神们见笑。

        在看霍亚飞的Qt入门教程时,使用Qt5.4做简单的通讯实验,在显示汉字方面发现了问题,在网上找到的几种方法都是在发送前将Qstring转化成Latin1放入QByteArray中,不过在接收端都显示??乱码,似乎在Qt5.4中并不适用,最后通过使用

QByteArray datagram = messagetosend.toUtf8().data();

代替

QByteArray datagram = messagetosend.toLatin1();
解决了这个问题,使得接收端可以正常显示汉字

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    sender = new QUdpSocket(this);
    receiver = new QUdpSocket(this);
    port = 45454;
    //设置接收端口
    receiver->bind(port,QUdpSocket::ShareAddress);
    //关联接收信号和信号处理函数
    connect(receiver,SIGNAL(readyRead()),
            this,SLOT(processPendingDatagram()));
    //显示本机ip
    ui->ip_locolhostlabel->setText(getip());
}

Widget::~Widget()
{
    delete ui;
}
//ip获取函数
QString Widget::getip()
{
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    foreach (QHostAddress address, list)
    {
        if(address.protocol() == QAbstractSocket::IPv4Protocol)
        {
            if(address.toString().contains("127.0.")||
               address.toString().contains("169.254."))
                continue;
            return address.toString();
        }
    //我们使用 IPv4 地址
    }
    return 0;
}
//信息发送函数
void Widget::on_pushButton_clicked()
{
    //获取端口号
    int port = ui->lineEdit_port->text().toInt();
    //获取目标ip地址
    QString targetip = ui->lineEdit_targetip->text();
    //将输入信息转化为字符串
    QString messagetosend =  ui->textEdit_msgsend->toPlainText();//最好不超过512个字节
    //将QString转化为字节列格式
    //QByteArray datagram = messagetosend.toLatin1();//我在Qt5.4版本转换成latin1实验多次总出现乱码
    //关键的转换步骤,在Qt5.4中转化成utf8可以实现汉字正确显示
    QByteArray datagram = messagetosend.toUtf8().data();
    sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress(targetip),port);
    ui->textEdit_msgsend->clear();
}

void Widget::processPendingDatagram()
{
    QByteArray datagram;//用于存放接收的数据报
    datagram.resize(receiver->pendingDatagramSize());
    receiver->readDatagram(datagram.data(),datagram.size());
    //将utf8格式转换回字符串类型
    QString str = QString::fromUtf8(datagram.data());
    ui->textEdit_msgrec->append(str);
}


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值