一、由于使用GDAL必须在MSVC版本下的Qt中,因此下载了一个MSVC版本的Qt,但是在显示中文、利用GDALOpen函数读取图像、选择文件夹、写入图像时都不能有中文字符,如果有则显示为乱码。比如我想利用打开文件对话框传递fileName给GDAL打开函数,直接传递是不行的,因为GDALOpen第一个参数必须是const char*,而fileName必须是QString类型,因此需要两者进行转换,即QString转const char*,在网上能查到许多方法,比如
QByteArray b = fileName.toLatin1();
const char* c = b.data();
或者
QByteArray b = fileName.toLocal8Bit();
const char* c = b.data();
或者
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
或者
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
或者改变编码等等,笔者都试了依然不行,几经尝试发现QString对象有一个toUtf8();函数,即
QByteArray b = fileName.toUtf8();
const char* c = b.data();
发现此时c能显示中文,但是要将CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");删除;
二、总结:在Qt中要想解决上述问题,必须按照下面的方法进行
首先删除CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
然后转为Uft8,即
QString fileName = QFileDialog::getOpenFileName(this,"Open Image","",("所有文件(*.*)"));
QByteArray b = fileName.toUtf8();
const char* c = b.data();
GDALDataset* dataSet = (GDALDataset*)GDALOpen(c,GA_ReadOnly);
这样就能能读取中文路径了,但是要在界面上正确显示中文,一个方法是将有中文字符串的地方加到QStringLiteral();函数里面,另一种一劳永逸的方法是在头文件前面加上
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
强制编译后的执行文件采用UTF-8编码。
MSVC2010以后的编译器可以使用此方案。