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 最后都有一个'\0'作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上'\0'。

// 重点:以上方法当 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] != '\0'; i++)

    {

        printf("0x%02x ", p[i]);

    }

    printf("\n");

    delete p;

    qDebug() << "toLocal8bit" << tmp.toLocal8Bit() << endl;//返回windows操作系统设置的字符集gb18030的编码

    qDebug() << "toUcs4" << tmp.toUcs4() << endl;           //返回ucs4编码组成的QVector,一个汉字占用4字节

    return a.exec();

}

猜你喜欢

转载自www.cnblogs.com/retry/p/9328748.html
今日推荐