關於GDAL180中文路徑不能開啟的問題分析與解決
轉自:http://blog.csdn.net/liminlu0314/article/details/6610069
GDAL1.8.0釋出很久了,一直沒有將自己的工程中的版本更新到1.80。今天將其更新到1.80發現含有中文路徑的檔案都不能開啟了,影像和向量檔案都是。仔細對比了GDAL1.72和GDAL1.80的程式碼,終於發現了問題的所在之處,詳細程式碼在GDAL_HOME\port\cpl_vsil_win32.cpp檔案中的類VSIWin32FilesystemHandler中,以Stat()函式為例(435行),其他函式類似。程式碼如下:
GDAL1.8.0程式碼(部分):
GDAL1.7.2程式碼(部分):
- /************************************************************************/
- /* Stat() */
- /************************************************************************/
- int VSIWin32FilesystemHandler::Stat( const char * pszFilename,
- VSIStatBufL * pStatBuf,
- int nFlags )
- {
- (void) nFlags;
- #if (defined(WIN32) && _MSC_VER >= 1310) || __MSVCRT_VERSION__ >= 0x0601
- if( CSLTestBoolean(
- CPLGetConfigOption( "GDAL_FILENAME_IS_UTF8", "YES" ) ) )
- {
- int nResult;
- wchar_t *pwszFilename =
- CPLRecodeToWChar( pszFilename, CPL_ENC_UTF8, CPL_ENC_UCS2 );
- nResult = _wstat64( pwszFilename, pStatBuf );
- CPLFree( pwszFilename );
- return nResult;
- }
- else
- #endif
- {
- return( VSI_STAT64( pszFilename, pStatBuf ) );
- }
- }
- /************************************************************************/
- /* Stat() */
- /************************************************************************/
- int VSIWin32FilesystemHandler::Stat( const char * pszFilename,
- VSIStatBufL * pStatBuf )
- {
- return( VSI_STAT64( pszFilename, pStatBuf ) );
- }
通過上面的程式碼對比,就會看到,原來在函式中新增了一個CPLGetConfigOption( "GDAL_FILENAME_IS_UTF8", "YES" )判斷,通過判斷是否是UTF8的編碼,而且指定的預設值還是UTF8編碼,在含有中文路徑的字串大多數的編碼應該是GBK的編碼,這樣,系統就將GBK的編碼當做UTF8的編碼來進行轉換,結果就是漢字全部是亂碼,導致的結果就是找不到檔案,所以打不開。
知道原因,那麼解決的方式就知道了,大概有下面幾種,各有優劣,供大家選擇
1:不改變GDAL原始碼,在自己呼叫GDALRegisterAll()和OGRAllRegiser()函式後,加上下面一句即可。
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
這樣的優點是,不用改動GDAL的原始碼,但是如果自己的工程中經常開啟影象的話,每次都要加,比較麻煩。
2:修改GDAL原始碼,將下面一句
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
分別新增到GDALAllRegister()函式【GDAL_HOME\frmts\gdalallregister.cpp73行左右】和OGRRegisterAll()函式【GDAL_HOME\ogr\ogrsf_frmts\generic\ogrregisterall.cpp38行左右】中,然後重新編譯GDAL即可。這樣的方式就和使用以前版本的GDAL一樣了,不用改動自己的程式碼,推薦使用這種方式。
3:修改GDAL原始碼,GDAL_HOME\port\cpl_vsil_win32.cpp檔案中的全部去掉CPLGetConfigOption全部去掉,或者將後面的YES改為NO,但是該工作量巨大,而且有好多地方,這種方式不推薦。
希望對那些還在為GDAL180中文路徑亂碼糾結的人們有所幫助。尤其是看到好多人在外面先把中文路徑轉成utf8的編碼,然後再呼叫GDAL的函式。
相關文章
- 解決關於IIS gzip不能正常啟用的問題
- vue 關於圖片路徑的問題Vue
- 關於Android程式設計檔案路徑中含有中文字元的問題解決辦法Android程式設計字元
- 關於listener無法啟動的問題解決
- 關於監聽不能啟動的解決方法
- 關於JDK1.2的JDBC中文問題的解決 (轉)JDKJDBC
- 解決pdf.js路徑問題JS
- JDK1.2關於JDBC中文問題的解決方案 (轉)JDKJDBC
- ngnix的windows路徑不能有中文Windows
- 終於解決nginx不支援thinkphp路徑2問題(正解!!!)NginxPHP
- 初學者想問一個關於Struts路徑的問題
- 關於Java中文問題的幾條分析原則Java
- 關於Class類與Classloader類的getResource方法獲取路徑的問題!
- 解決基於TypeScript 的 RN專案相對路徑引入元件的問題TypeScript元件
- 遠端服務不能啟動問題的解決方法
- [提問交流]關於後臺選單欄路徑問題!
- Laradock 網路問題不能下載解決
- 關於 maatwebsite/excel 匯出不能識別中文檔名稱的問題WebExcel
- 怎麼解決Ubuntu中spyder不能輸入中文的問題阿Ubuntu
- 解決Hexo關於圖片的問題Hexo
- 關於解決問題的幾個段位
- ATL元件中文路徑註冊問題 (轉)元件
- 解決問題的方法和途徑-問題管理
- 怎樣成為解決問題的高手?——關於問題解決的關鍵4步驟
- vue cli 關於使用絕對路徑引用圖片的問題Vue
- JavaWeb 專案中的絕對路徑和相對路徑以及問題的解決方案JavaWeb
- 關於網路硬體配置出現問題,無法上網問題的解決
- web專案絕對路徑與相對路徑的問題Web
- 解決關於Mac不能複製複製檔案到隨身碟的問題Mac
- URL請求不能解決中文請求的問題
- 解決localdb中文智慧的問題
- 暫時解決的中文問題
- EBS R12.1.2下開啟關閉app時報錯問題分析及解決APP
- oracle 10g crs 不能啟動問題解決案例Oracle 10g
- 關於 LF will be replaced by CRLF 問題的解決方式
- 一個關於/root/.gvfs的問題解決?
- 不能建立降序索引的問題的解決索引
- 解決POI中DateUtil.isCellDateFormatted(Cell cell)不能判斷中文日期的問題LDAORM