昨天的博客里面使用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中文路径不能打开提供了一点点的思路吧。希望对大家有所帮助。