• QT之数据类型间转换


    QT之数据类型间转换


    一、QByteArray与QString互转

    QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)

    //QByteArray转为QString示例:
    QByteArray ba("abc123");
    QString str = ba; //或str.prepend(ba);
    qDebug()<<str ; //输出:"abc123"
    
    QString s("hello"); //方法1:
    QByteArray cstr = s.toAscii();
    
    QString s("hello");//方法2:
    QByteArray cstr = s.toLatin1();
    

    二、 QString 与 char *

    QString 转 char *,需要用到 QByteArray 类, 因为 char * 最后都有一个''作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上''。

    // 重点:以上方法当 QString 里不含中文时,没有问题,但是 QString 内含有中文时,转换为 char * 就是乱码。
    //(此处不研究中文编码)
    QString  str;
    char*  ch;
    QByteArray ba = str.toLatin1(); // must
    ch=ba.data();
    
    //方法一:
    	char* str;
    	QString string(str);
    //方法二:不重新定义对象
    inline QString charToQstring(char* charPara)
    {
        return QString(QLatin1String(charPara));
    }
    

    三、 QBYteArry 与 char *

    // QByteArray 转 char*
    QByteArray byte;
    char* str = byte.data();
    
    //char*  转 QByteArray
    char* str;
    QByteArray byte(str);
    

    四、 QChar与 char

    //qchar - char 
    // char Qchar::toLatin1()  或者 char Qchar::toAscii() const
    char ch;
    qchar qch;
    ch = qch.toLatin1;
    
    //char -> qchar
    qchar(char ch)
    qchar (uchar ch)
    

    五、字符编码

    • 1、gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。windows系统可能使用的就是这两种的一种。

    • 2、unicode字符集以2个或以上的字节表示一个汉字。

    • 3、通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。

    • 4、utf8字符集以2个或以上的字节表示一个汉字。实际上具体的数值和unicode有很大的相关性。

    • 5、ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1。

    5.1、QString编码

    QString内部可能是使用unicode字符集来存储文字。具体输出的时候,就可以输出该文字对应的unicode, ucs4, utf8, gb18030的编码。


     //代码示例
    #include <QCoreApplication>
    
    #include <QDebug>
    
    int main(int argc, char *argv[])
    
    {
    
        QCoreApplication a(argc, argv);
    
        QString tmp="汉字";
    
        qDebug() << "tmp=" << tmp << endl;
    
        qDebug() << "toUtf8" << tmp.toUtf8() << endl;       //返回utf8编码的一串数字
    
        qDebug() << "toLatin1" << tmp.toLatin1() << endl;   //"汉字"不在latin1字符集中,所以结果无意义
    
        char *p = new char[1+strlen(tmp.toLatin1().data())];
    
        strcpy(p, tmp.toLatin1().data());
    
        for (int i=0; p[i] != ''; i++)
    
        {
    
            printf("0x%02x ", p[i]);
    
        }
    
        printf("
    ");
    
        delete p;
    
        qDebug() << "toLocal8bit" << tmp.toLocal8Bit() << endl;//返回windows操作系统设置的字符集gb18030的编码
    
        qDebug() << "toUcs4" << tmp.toUcs4() << endl;           //返回ucs4编码组成的QVector,一个汉字占用4字节
    
        return a.exec();
    
    }
    

  • 相关阅读:
    Unity Shader _Time 的单位
    egg-sequelize 实现 增删改查
    Eggjs 联表查询
    Eggjs 菜单权限管理
    Eggjs 角色管理 -- 对角色树进行 增删改查
    Egg.js 实现一维的对象数组转化为树形数组
    Egg.js 中 Session 的设置和获取
    Egg.js 中 Cookie 的设置和获取
    Egg 安全机制 CSRF 的防范
    Egg middleware 中间件
  • 原文地址:https://www.cnblogs.com/retry/p/9328748.html
Copyright © 2020-2023  润新知