对于不含中文的文件路径,可用如下代码解决:
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路径处保存的文件里,中文路径显示是正常的。