一般情况下在Qt程序中使用c/c++原生的文件api(fopen、ifstream)打开在中文路径中的文件时一般会报文件打开失败或者文件不存在的错误,而使用QFile打开中文路径中的文件时却不会出现该问题。
主要的原因在于:Qt中的QString使用的是UTF-16编码,而c/c++api中使用的是本地系统的编码格式,所以在打开文件的时候会报错。
解决该问题有两种方法:
- 使用Qt原生的QFile类来打开中文路径的文件;
- 使用QString中的toLocal8Bit()方法。
本文使用的Qt版本:Qt5.4
使用QFile打开中文路径中的文件
void MainWindow::on_pushButton_clicked(void)
{
QString strFilePath = QFileDialog::getOpenFileName(this, "open", "");
qDebug() << "打开文件的路径为:" << strFilePath;
QFile file;
file.setFileName(strFilePath);
if (!file.open(QIODevice::ReadWrite))
{
qDebug() << "文件打开失败";
}
else
{
qDebug() << "文件打开成功";
qDebug() << "文件内容:" << QString(file.readAll());
}
}
运行结果如下:
使用QString中的toLocal8Bit()方法
void MainWindow::on_pushButton_clicked(void)
{
QString strFilePath = QFileDialog::getOpenFileName(this, "open", "");
qDebug() << "打开文件的路径为:" << strFilePath;
QByteArray aDatas = strFilePath.toLocal8Bit();
char acReadBuf[256] = {0};
FILE *pFile = NULL;
pFile = fopen(aDatas.data(), "r");
if (NULL == pFile)
{
qDebug() << "文件打开失败";
}
else
{
qDebug() << "文件打开成功";
fgets(acReadBuf, 256, pFile);
qDebug() << "文件内容:" << QString(acReadBuf);
}
}
运行结果如下: