char *和QString和string之间的转换

在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;

版权声明:本文为qq_36709685原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。