GDAL1.8.0发布很久了,一直没有将自己的工程中的版本更新到1.80。今天将其更新到1.80发现含有中文路径的文件都不能打开了,影像和矢量文件都是。仔细对比了GDAL1.72和GDAL1.80的代码,终于发现了问题的所在之处,详细代码在GDAL_HOME\port\cpl_vsil_win32.cpp文件中的类VSIWin32FilesystemHandler中,以Stat()函数为例(435行),其他函数类似。代码如下:
       GDAL1.8.0代码(部分):
/************************************************************************/
/*                                Stat()                                */
/************************************************************************/
int VSIWin32FilesystemHandler::Stat( const char * pszFilename, VSIStatBufL * pStatBuf,int nFlags )
{(void) nFlags;#if (defined(WIN32) && _MSC_VER >= 1310) || __MSVCRT_VERSION__ >= 0x0601if( 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 ) );}
}

GDAL1.7.2代码(部分):

/************************************************************************/
/*                                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的函数。

关于GDAL180中文路径不能打开的问题分析与解决相关推荐

  1. python支持中文路径_打开python遍历中文目录得到的文件路径报错

    各位朋友们好,我是一名python新手,现在遇到一个问题,恳请各位朋友们能指点一下我. 我的环境是:ubuntu14.04系统,python2.7 用python遍历一个目录,目录层次结构如下: 这是 ...

  2. 设备通过国标GB28181/海康Ehome接入EasyCVR,视频无法打开的原因分析及解决方法

    EasyCVR平台支持多类型设备.多协议方式接入,包括市场主流标准协议国标GB/T28181.RTMP.RTSP/Onvif协议等,以及厂家私有协议,如海康SDK.大华SDK.海康Ehome等.平台可 ...

  3. GDAL\OGR C#中文路径不支持的问题解决方法

    昨天的博客里面使用GDAL.OGR库写了一个用C#读取图像和矢量信息的一个小Demo.忘记测试中文路径了,今天测试了一下,发现中文路径果然不支持.如下图所示: 出现这个问题很奇怪,我自己编译的GDAL ...

  4. 使用SQLite3支持中文路径

    最近编写控制点库的几何精校正中使用SQLite来管理控制点,在使用过程中发现SQLite发现不支持中文路径,打开中文路径的数据库在查询的时候提示"no such table: ***&quo ...

  5. 关于VSCode调试无法支持中文路径的曲线救国方法

    虽然原则上,为了避免不必要的问题,代码相关最好是使用全英文路径,但是对有些人来说,中文名的识别比英文强万倍,所以,这里不讨论直接使用英文. 最近在LeetCode刷题,刷题时本地测试用的代码都是放在同 ...

  6. ifstream中文路径

    最近维护一个项目,遇到了ifstream在中文路径下打开文件失败的bug,我搜索了一下,最后整理成下文以后日后查阅. 一.问题重现 vs2008下创建一个简单win32工程. 使用ANSI编码方式:项 ...

  7. ifstream 打开中文路径乱码问题处理

    ifstream  打开中文路径乱码问题处理 使用vs2008. 发现使用ifstream打开中文路径乱码.然后查了好久.发现使用下面的法子可以了. 记录一下. 附上代码: std::locale l ...

  8. sqlite3打开中文路径数据文件失败解决方法

    今天用sqlite3访问中文路径的数据库文件,发现sqlite3_open函数返回失败,问度娘后,有网友建议sqlite3_open16打开,sqlite3_open16和sqlite3_open区别 ...

  9. C语言打开中文路径文件

    如何用C语言打开Windows下中文路径文件? 虽然不清楚原理,但我今天确实找到一种方法. 1.先编写C语言程序,里面有你的想要打开的带中文路径的文件的逻辑,fopen函数的字符串中就直接用你想要打开 ...

最新文章

  1. redispython源文件_Redis与Python在项目中的交互
  2. 对 Session 的深入探讨
  3. 中国电子用LCP树脂市场未来发展展望及十四五规划咨询建议报告2022-2028年版
  4. Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)
  5. 使用cmake安装mysql5.5.13
  6. 使用SublimeText 作为Python 的开发环境
  7. 如何使用Callable和FutureTask
  8. 下载的oracle如何解压,深度概述Ubuntu oracle下载解压
  9. ubuntu 缺少php安装包,ubuntu 16.04 lts安装php环境和composer依赖包管理
  10. cookie工作流程
  11. 开关管三极管和MOS管的选择
  12. 有盘和无盘服务器,网吧系统的终极解决之道:无盘系统+有盘(转)
  13. Unity 代码加密 Mono 编译与加密 windows版
  14. 亲测有效,解决C盘空间不足问题
  15. android中读取svg文件,Android如何加载SVG格式的矢量图
  16. 【STM8】PWM 捕获实战:占空比和频率(TIM2)
  17. Matlab图像处理入门教程(菜鸟级)
  18. 超灵敏磁传感解决方案助力汽车产业发展
  19. 制作一个带rEFInd引导菜单的WinPE启动光盘
  20. 【Pycharm教程】代码调试、git操作、连接远程服务器

热门文章

  1. mac系统自带python开发环境吗_Mac OS搭建Python开发环境的几个误区
  2. 洛谷——P1089 [NOIP2004 提高组] 津津的储蓄计划
  3. THREEJS - mousedown/mouseup等鼠标相关事件失效
  4. Requirejs常用配置和应用
  5. extundelete实现Linux下文件/文件夹数据恢复!
  6. 新疆卫生系统计算机考试题库,2014新疆维吾尔自治区计算机等级考试试题 二级C试题最新考试试题库...
  7. springboot启动命令linux,springboot项目命linux环境下命令启动
  8. 5号字对应的数字字号_写好公文的几个数字口诀
  9. Java - 泛型 ( Generic )
  10. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理