QString转换为const char*(QFileDialog得到的QString文件路径(含中文)转换为fstream可用的const char*文件路径)以及解决Qt中文字符串乱码的一种思路

29 篇文章 2 订阅

对于不含中文的文件路径,可用如下代码解决:

QString path=QFileDialog::getOpenFileName(this,QObject::tr("set filepath"));
	char*  ch;
	QByteArray ba =path.toLatin1();   
	ch=ba.data();
	ofstream test;
	test.open(ch);
	test<<"测试测试";
	test.close();
如果需要支持中文路径,则将QString::toLocal8bit()转换为QByteArray,再调用函数data()获得char*对象,代码如下:

QString path=QFileDialog::getOpenFileName(this,QObject::tr("set filepath"));
	char*  ch;
	QByteArray ba =path.toLocal8Bit();   
	ch=ba.data();
	ofstream test;
	test.open(ch);
	test<<"测试测s试";
	test.close();
不过,也可以用QFile和QTextStream来替代这种方案,无需任何转换。代码如下:


QString path=QFileDialog::getOpenFileName(this,QObject::tr("set filepath"));
	QFile test(path);
	if(test.open(QIODevice::WriteOnly))
	{
		QTextStream te(&test);
		te<<QString::fromLocal8Bit("测试");//本行如果直接写te<<"测试";生成的文件打开会乱码。setCodec等函数也无法解决乱码问题。
		test.close();
	}
	else
		qDebug("*****open failed********");

上面用了QString::fromLocal8bit(“测试”)来将中文转换为正确编码的QString输入到文件中。源码直接用“测试”这个字符串,转换为QString对象时会用默认的编码,不一定是源码的编码格式,所以会出现乱码。比如以下代码:

QString path=QFileDialog::getOpenFileName(this,QObject::tr("set filepath"));
	QFile test(path);
	if(test.open(QIODevice::WriteOnly))
	{
		QTextStream te(&test);
		te<<"测试";//本行如果直接写te<<"测试";生成的文件打开会乱码。setCodec等函数也无法解决乱码问题。
		test.close();
	}
	else
		qDebug("*****open failed********");
实际上是将“测试”这个const char*对象转换为QString,转换过程中会用Qt默认的编码格式,因此会出现乱码。上面代码和以下代码等价,同样会乱码。

QString path=QFileDialog::getOpenFileName(this,QObject::tr("set filepath"));
	QFile test(path);
	if(test.open(QIODevice::WriteOnly))
	{
		QTextStream te(&test);
		QString str="测试";//等价QString str("测试")
                te<<str;
		test.close();
	}
	else
		qDebug("*****open failed********");
将上面代码换成:

QString path=QFileDialog::getOpenFileName(this,QObject::tr("set filepath"));
	QFile test(path);
	if(test.open(QIODevice::WriteOnly))
	{
		QTextStream te(&test);
		QString str=QString::fromLocal8Bit("测试");//等价QString str(QString::fromLocal8Bit("测试"))
                te<<str;
		test.close();
	}
	else
		qDebug("*****open failed********");

中文就显示正常了。


从控件中得到的QString对象如果包含中文,是不需要考虑编码问题的。比如如下代码:

QString path=QFileDialog::getOpenFileName(this,UdpSender::tr("set filepath"));
	QFile test(path);
	if(test.open(QIODevice::WriteOnly))
	{
		QTextStream te(&test);
		te<<path;
		test.close();
	}
	else
		qDebug("*****open failed********");
假设文件路径path中就包含了中文字符,运行以上代码后,path路径处保存的文件里,中文路径显示是正常的。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值