在Qt编程过程中避免不了char* QString string之间的转换问题,整理多个博客以及开发的经验
一、char * 和QString之间的转换
1.1 char * 转换为 QString
将 char * 转换为 QString 比较容易操作,我们可以使用 QString 的构造函数进行转换:
QString(const QLatin1String &str);
QLatin1String 的构造函数:
QLatin1String(const char *str);
因此用下面这个语句就可以将 char * data 转换为 QString str 了,如下:
str = QString(QLatin1String(data ));
1.2 QString转换为char *
将 QString 转 char *,需要用到 QByteArray 类,QByteArray 类的说明详见 Qt 帮助文档。因为 char * 最后都有一个’\0’作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上’\0’。
方法如下:
QString str;
char* ch;
QByteArray ba = str.toLatin1(); // must
ch=ba.data();
这样就完成了 QString 向 char * 的转化。经测试程序运行时不会出现 bug。注意第3行,一定要加上,不可以 str.toLatin1().data() 这样一步完成,否则可能会出错。
补充:以上方法当 QString 里不含中文时,没有问题,但是 QString 内含有中文时,转换为 char * 就是乱码,采用如下方法解决:
方法1:
添加GBK编码支持:
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
修改为:
QString str;
char* ch;
QByteArray ba = str.toLocal8Bit(); // toLocal8Bit 支持中文
ch=ba.data();
方法2:
先将 QString 转为标准库中的 string 类型,然后将 string 转为 char *。如下:
QString filename;
std::string str = filename.toStdString();
const char* ch = str.c_str();
二、string和QString之间的转换
2.1 QString转换String
string s = qstr.toStdString();
2.2 String转换QString
QString qstr2 = QString::fromStdString(s);
三、string和char *之间的转换
3.1 string to char*
方式1:
std::string str = "string";
char* chr = const_cast<char*>(str.c_str())
方式2
string str = "some string" ;
char *cstr = &str[0];
方式3
std::string str = "string";
const char *cstr = str.c_str();
方式4
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
3.2 char* to string
方式1:直接赋值:
char c[] = "this is a char array";
const char* t = "const char";
string s = t;
string ss = c;
方式2:const char*转string
const char* cc = "this is a const exp";
string s(cc, cc + strlen(cc));
方式3. char* 和const char*
const char* src = "this is a const exp";
char* ch = const_cast<char*>(src);
const char* dst = static_cast<const char*>(ch);
cout << ch << endl;
cout << dst << endl;