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();
}