1. 程式人生 > >Qt中文路徑亂碼問題(MSVC編譯器)

Qt中文路徑亂碼問題(MSVC編譯器)

        一、由於使用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以後的編譯器可以使用此方案。