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;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值