zoukankan      html  css  js  c++  java
  • 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();
    
    }
    

  • 相关阅读:
    1012 The Best Rank (25 分)(排序)
    1011. World Cup Betting (20)(查找元素)
    1009 Product of Polynomials (25 分)(模拟)
    1008 Elevator (20 分)(数学问题)
    1006 Sign In and Sign Out (25 分)(查找元素)
    1005 Spell It Right (20 分)(字符串处理)
    Kafka Connect 出现ERROR Failed to flush WorkerSourceTask{id=local-file-source-0}, timed out while wait
    flume、kafka、avro组成的消息系统
    Java23种设计模式总结【转载】
    Java编程 思维导图
  • 原文地址:https://www.cnblogs.com/retry/p/9328748.html
Copyright © 2011-2022 走看看