昨天的部落格裡面使用GDAL、OGR庫寫了一個用C#讀取映像和向量資訊的一個小Demo。忘記測試中文路徑了,今天測試了一下,發現中文路徑果然不支援。如所示:
出現這個問題很奇怪,我自己編譯的GDAL庫中我已經修改GDAL的原始碼,把裡面的UTF8設定為NO了,怎麼還是會出現這個問題呢?為了驗證我的GDAL庫版本是不是支援中文路徑,使用gdalinfo.exe工具來進行驗證,在命令列中輸入“gdalinfo.exe F:\Data\TestData\6-映像鑲嵌\PS鑲嵌.img”,然後斷行符號發現映像資訊正常讀取出來,如所示,這樣看來問題不是出在GDAL庫裡面了,估計是C#的預設編碼導致的。
接下來,就查看C#原始碼的編碼,找了好多,將檔案名稱轉為UTF8,結果還是不行,自己寫了轉換的函數(當然是找了很多資料才寫出來了,C#菜鳥啊)。代碼貼出來,不知道對不對:
private string ConvertString2UTF8(string strSrc) { string strTemp = strSrc; byte[] utf8bytes = System.Text.Encoding.Default.GetBytes(strTemp); byte[] utf8bytes2 = System.Text.Encoding.Convert(System.Text.Encoding.Default, System.Text.Encoding.UTF8, utf8bytes); strTemp = System.Text.Encoding.Default.GetString(utf8bytes2); return strTemp; }
轉了還是不行,這就鬱悶了。接著查看了一下C#原始碼的預設儲存編碼,發現是UTF-8的編碼(查看原始碼的編碼,可以在VS中,先開啟原始碼,然後在檔案菜單下面有個進階儲存選項,點開就可以看到當前的編碼,也可以修改當前的編碼),難道C#擷取的檔案名稱預設的就是UTF8的編碼?於是在Gdal.AllRegister();的後面加了一句Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8",
"YES");【注意:因為我之前在編譯GDAL的時候,設定了GDAL_FILENAME_IS_UTF8的屬性為NO,為了保持原來的樣子,所以再在後面設定為YES,感覺之前做的都白費了。。。囧。。。】。好了,儲存,編譯,運行,大功告成,中文路徑終於識別了……截個圖……淚奔啊……
再測試一個向量檔案,看看對不對,如下:
通過上面的驗證,是不是可以這麼認為,C#中的編碼預設的都是UTF-8,所以在使用GDAL的時候,壓根不需要對原來的代碼進行修改就可以使用!?雖然這個觀點沒有足夠的證據表明其是正確的,但是這個對使用GDAL中文路徑不能開啟提供了一點點的思路吧。希望對大家有所協助。