關於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
- 解決pdf.js路徑問題JS
- ngnix的windows路徑不能有中文Windows
- WPS 2019解決不能啟用巨集問題
- Laradock 網路問題不能下載解決
- 關於Failed to resolve的問題解決AI
- 解決基於TypeScript 的 RN專案相對路徑引入元件的問題TypeScript元件
- 遠端服務不能啟動問題的解決方法
- [提問交流]關於後臺選單欄路徑問題!
- 怎麼解決Ubuntu中spyder不能輸入中文的問題阿Ubuntu
- 關於 maatwebsite/excel 匯出不能識別中文檔名稱的問題WebExcel
- 解決Hexo關於圖片的問題Hexo
- 關於解決問題的幾個段位
- 怎樣成為解決問題的高手?——關於問題解決的關鍵4步驟
- Windows程式讀取不了中文路徑問題Windows
- 解決關於Mac不能複製複製檔案到隨身碟的問題Mac
- 關於網路硬體配置出現問題,無法上網問題的解決
- URL請求不能解決中文請求的問題
- 關於 LF will be replaced by CRLF 問題的解決方式
- 不能建立降序索引的問題的解決索引
- 路徑問題
- 解決中文亂碼問題
- MySQL 中文 like 問題解決MySql
- 關於 PHP Session ID 改變的問題解決PHPSession
- Ajax跨越問題原因分析與解決思路
- 在Vue 專案 webpack 打包中關於 背景圖片的路徑問題VueWeb
- 關於BGE-M3接入LangChain時遇到的問題與解決方法LangChain
- 關於SSL協議未開啟的解決方案協議
- vue 解決不能攜帶session問題VueSession
- 解決macOS vim 不能連按問題Mac
- 解決webpack不能匹配post請求的問題Web
- 解決Django本地介面不能跨域訪問的問題Django跨域
- 關於 Safari back 按鈕在 iOS 16 不能按照期望工作的問題分析iOS
- 關於input的一些問題解決方法分享
- Python大資料分析學習.路徑問題Python大資料
- springmvc 解決中文亂碼問題SpringMVC
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter