C GDAL編碼問題1 開啟mdb中文路徑

2022-03-10 19:15:42 字數 1940 閱讀 7130

gdal在gis界是赫赫有名的,它即有操作柵格的gdal元件,又有讀取向量的ogr類庫,可謂"文武雙全",連 esri也在使用,跨平台、開源、支援資料格式多、操作效率高……異常強勢!

畢竟是外國的東西,會有那麼一點水土不服,那就是編碼問題。強大的開源的元件好像都有這個毛病,仔細想想python、sqlite、qt、qgis、gdal……

顯示是亂碼了,搜遍網路,幾乎沒有人提出過開啟mdb有異常,更別說解決方案;關於亂碼,要麼說c++,要麼講shp。**的文章總是千篇一律,有用的方法萬里難挑一。只有李民錄大佬認真分析過,可他給的轉換編碼方案也不適用。絕大多數給的方案是,新增如下**:

//方案一

osgeo.gdal.gdal.setconfigoption("gdal_filename_is_utf8", "yes");

//方案二

osgeo.gdal.gdal.setconfigoption("gdal_filename_is_utf8", "no");

由於gdal版本眾多,方案一和方案二的設定都是衝突的,我也是醉了,對1.9、2.2、2.4版本的gdal都無法解決mdb中文路徑問題。

分析1:類庫版本比較

分析2:資料路徑比較

string gdbpath1 = @"d:\data\全國行政區劃.gdb";(√)

string gdbpath2= @"d:\data\china. gdb";(√)

string shppath1 = @"d:\data\全國行政區劃\省.shp";(√)

string shppath2 = @"d:\data\china\p.shp ";(√)

string mdbpath1 = @"d:\data\全國行政區劃.mdb";(х)

string mdbpath2 = @"d:\data\國行政區劃.mdb";(х)

string mdbpath3 = @"d:\data\china.mdb";(√)

測試發現,凡是帶中文的mdb都不行,與字元數奇偶無關。

分析3:編碼方式比較

測試比較預設編碼(gbk2313)、utf-8、utf-16,確實可能是因為編碼不同導致轉換異常,我們來看原始碼中關鍵方法open,要求輸入utf8_path,然後第一句就直接將輸入路徑轉為utf8位元組,不管你輸入的啥子,直接一頓猛如虎的操作,當作utf8進行處理,這就是中文路徑報錯的原因。首先想到就是把含有中文的路徑直接轉換為utf8,但這裡有乙個重大bug,c#的變數路徑都是ansi編碼,不存在轉換問題,只能轉位元組的編碼,不能轉字串的編碼。

即在是編碼錯誤轉換,那直接改成轉換成預設編碼好了。

修改前:將ogr.stringtoutf8bytes(utf8_path)

修改後:system.text.encoding.default.getbytes(utf8_path)

但測試後發現,gdb和shp又找不開了,真是"牛鞭不滑馬鞭滑"(形容問題處理後又導致了新問題的一句土話)。理論上,mdb,gdb,shp應該是一樣的問題才對,真不知裡面是怎麼處理的。無奈,暫時通過判斷輸入路徑是否為mdb來判斷是否修改,如下:

修改後的dll(只修改ogr_csharp.dll)和測試demo:

裡面還解決了兩個問題:

中文屬性編碼問題:

中文圖層編碼問題:

mdb檔案在英文系統下無法開啟的問題。。。

軟體沒有測試就一定有bug 真是至理名言阿,這不,我給客戶做的乙個韓文軟體,由於自己想當然的認為做過很多類似的多國語言軟體了,不會有問題的。結果,客戶在英文版windowsxp下一用,竟然會崩潰!立馬懷疑是客戶人品不好,讓對方換台機器試試,結果還是崩潰。換成中文版的windowsxp就一點問題都沒有...

檔案開啟失敗顯示編碼問題

window 讀取檔案可以用 但是在字串中 是被當作轉義字元來使用,所以 d a.txt 會被轉義成 d a.txt 這是正確路徑,所以不會報錯。而 c users frankyuan pictures camera roll win 20161010 08 51 57 pro.jpg 中經過轉義之...

C 記事本開啟和字元編碼問題

字串的邊編碼有 asci mbcs gb2312 gbkbig5 unicode utf 8 9 base64 我在寫記事本本編輯器的時候執行的時候開啟檔案出現了亂碼,很大程度上面是編碼問題,vs2012不知道是為什麼有乙個問題就是不能直接使用io類中的file 要這麼使用前面要加system.io...