C++与Qt常用的类型转换

注意: c++11不允许char* c = "123";这种初始化,通常都用const char*stringchar*是不允许的。
printf("%s")只接收char*const char*,不能是string

stringToNum

template
Type stringToNum(const std::string& str)
{
std::istringstream iss(str);
Type num;
iss >> num;

return num;

}

const char* 转 string

1
2
const char* cc = "12345";
std::string s = cc;

其实就是直接赋值

string转const char*

1
2
3
std::string s = "12345";
const char* cc = s.c_str();
const char* cc = s.data(); // 实际调用同c_str()

const char 转 char

1
char* c = const_cast<char*>(cc);

char 转 const char

直接赋值转换即可

拼接const char*

先转换成string,用+运算符,最后转为const char*类型。或者用strcat,但是要保证空间足够:

1
2
3
4
5
6
char str1[30];
memset(str1, 0, sizeof(str1));
memcpy(str1, "abcd",4);
const char* str2 = "1234";
strcat(str1, str2);
cout << str1 <<endl;

还有stringstream
1
2
3
4
5
6
#include <sstream>

std::stringstream ss;
ss << a << b;

std::string combined = ss.str();

数值类型转为string

C++11标准增加了全局函数std::to_string,有多个重载,将常用数值类型转为string

1
2
3
4
5
6
7
8
9
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val)

string转数值类型

也是C++11新增加的函数

1
2
3
4
std::stod 		// string转double
std::stof // string转float
std::stoi // string转int
std::stol // string转long

QString转std::string

QString::toStdString

std::string转QString

QString::fromStdString

QString转char*

1
2
3
QString str1 = "Hello";
QByteArray a = str.toLatin1();
char *b = a.data();

char* 转QString

1
2
char *b;
QString str2 = QString(QLatin1String(b));

QByteArray与QString

QString会用UTF-16编码存储,而qDebug()等I/O函数会以UTF-8编码处理。其实转换后的字节流是正确的,只是显示时用了和字节流不同的编码方式处理导致乱码

// Qt默认会使用本机编码,所以对于中文系统,下面这句设置是多余的
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

1
2
3
4
5
6
7
8
9
//QByteArray转QString
QByteArray ba;
QString s = QString(ba); // 强制转换

//QString转QByteArray
QString s="abc";
QByteArray ba = s.toLocal8Bit(); // 受setCodecForLocale影响,会转换为设定的编码。如果本机不支持指定编码,则会按toLatin1处理
QByteArray baLatin1 = str1.toLatin1(); //不受setCodecForLocale影响,强制转换为ISO-8859-1编码
QByteArray bUtf8 = str1.toUtf8(); // 不受setCodecForLocale影响,强制转换为UTF-8编码

QByteArray为汉字时,输出会出现乱码,解决方法:

1
2
3
4
5
QByteArray ba = "汉字";
QTextCodec* tc = QTextCodec::codecForName("GBK");
qDebug()<<ba; // "\xBA\xBA\xD7\xD6"
qDebug()<<QString(ba); // "????"
qDebug()<<tc->toUnicode(ba); // 汉字

wchar_t 转 QString

1
2
wchar_t a[10];
QString str1= QString::fromWCharArray(a);

int/char 转 16进制QString 补0

1
2
int a = 0x0483;
QString str1 = QString("%1").arg(a,4,16,QLatin1Char('0'));

环境设置为GB2312,汉字会显示为乱码,使用QStringLiteral会报错error: converting to execution character set: Illegal byte sequence,发现是Mingw编译器问题,换成MSVC编译正常。

参考:Qt字符编码、乱码的一点总结