GDAL C#中文路径,中文属性名称乱码问题
昨天写的博客,将C#读取shp中文属性值乱码的问题应该可以解决,博客地址为:http://blog.csdn.net/liminlu0314/article/details/54096119,然后又测试发现中文路径,中文属性值如果有中文时,也会出现乱码,具体表现为偶数个汉字没有问题,奇数个汉字会出现乱码。
继续调试C#的源码,发现问题还是在于将C++库中返回的结果进行编码转换的时候导致的,源码位于OgrPINVOKE.cs文件中。截取原始的代码如下:
protected class SWIGStringHelper {
public delegate string SWIGStringDelegate(string message);
static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString);
[DllImport("ogr_wrap", EntryPoint="SWIGRegisterStringCallback_Ogr")]
public static extern void SWIGRegisterStringCallback_Ogr(SWIGStringDelegate stringDelegate);
static string CreateString(string cstring) //这个函数出问题
{
return cstring;
}
static SWIGStringHelper() {
SWIGRegisterStringCallback_Ogr(stringDelegate);
}
}
出问题的函数在于CreateString,这个函数是一个类似C的回掉函数,直接将C库中返回的const char*直接转为C#中的string进行返回,这样的结果就是如果C库中的const char*以UTF8编码的话,直接返回的就是乱码,并且可能导致截断。所以就表现为图层名乱码,属性字段名乱码等问题。
解决方案与昨天处理的类似,将C库中的const char*用UTF8编码之后再返回应该就没问题了,修改后的代码如下所示:
protected class SWIGStringHelper {
public delegate string SWIGStringDelegate(IntPtr message);//此处修改参数类型
static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString);
[DllImport("ogr_wrap", EntryPoint="SWIGRegisterStringCallback_Ogr")]
public static extern void SWIGRegisterStringCallback_Ogr(SWIGStringDelegate stringDelegate);
static string CreateString(IntPtr pNativeData)//此处函数内容需要修改
{
if (pNativeData == IntPtr.Zero)
return "";
//下面这一长串就是获取C字符串的长度,用Marshal库中的函数获取的都有问题,所以就用下面的循环来自己找了,如果有更好的方案请告知。
int nAnsiLength = Marshal.PtrToStringAnsi(pNativeData).Length;
int nUniLength = Marshal.PtrToStringUni(pNativeData).Length;
int nMaxLength = (nAnsiLength > nUniLength) ? nAnsiLength : nUniLength;
int length = 0;
for (int i = 0; i < nMaxLength; i++)
{
byte[] strbuf1 = new byte[1];
Marshal.Copy(pNativeData + i, strbuf1, 0, 1);
if (strbuf1[0] == 0)
{
break;
}
length++;
}
byte[] strbuf = new byte[length];
Marshal.Copy(pNativeData, strbuf, 0, length);
return System.Text.Encoding.UTF8.GetString(strbuf);
}
static SWIGStringHelper() {
SWIGRegisterStringCallback_Ogr(stringDelegate);
}
}
修改完保存,同样的问题有4个文件,分别是OgrPINVOKE.cs、GdalPINVOKE.cs、OsrPINVOKE.cs和GdalConstPINVOKE.cs。 将这四个文件中SWIGStringHelper类中的内容都按照上面这样修改,然后重新生成dll,即可。
PS:上面的修改完之后,调试时没有问题,直接运行的时候最后一个汉字可能会丢失,问题很奇怪,不知道为啥。
编译好的库已经上传,下载地址为:http://download.csdn.net/detail/liminlu0314/9730475
PS:经过测试,发现上面丢失最后一个汉字的问题已经解决,之前是debug的版本,用release的就没有这个问题。
GDAL C#中文路径,中文属性名称乱码问题的更多相关文章
- python listdir() 中文路径 中文文件夹 乱码 解决方法
python listdir() 中文路径 中文文件夹 乱码 解决方法 listdir(path)返回的结果的编码似乎和我们提供的 path 参数的编码有关: path = 'd:/test' try ...
- VS2017编译GDAL(64bit)+解决C#读取Shp数据中文路径的问题
编译GDAL过程比较繁琐,查阅了网上相关资料,同时通过实践,完成GDAL的编译,同时解决了SHP数据中文路径及中文字段乱码的问题,本文以“gdal-2.3.2”版本为例阐述整个编译过程. 一.编译准备 ...
- GDAL支持中文路径和Shp文件中文属性写入
在使用GDAL的过程中,为了支持中文,比需手动进行中文路径的设置,同时特别是在对Shp的属性进行中文输入的时候,都必须进行必要的设定. 为了支持中文路径,在注册了驱动之后,加上第三句就可以了.必须设置 ...
- 浅析GDAL库C#版本支持中文路径问题
GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...
- .net文件压缩和解压及中文文件夹名称乱码问题
/**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...
- gdal中文路径无法打开问题
在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”. 同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加下面这句代码(大多 ...
- navicat 找不到系统路径 【修改了系统路径中文名称引起的】
这是我还没修改系统路径中文名称时的路径, 怎么办? 关闭当前用户连接 右键,选择连接属性 把那个改了即可
- QGis、Gdal本地中文路径问题
编译qgis完整项目后,由于Gdal库的原因,中文路径下通过添加矢量数据中数据库中是没有OGR的Oracle数据库功能的: 最开始打算通过重新编译gadl库从内部支持中文的(有成功的麻烦也请告诉我), ...
- ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法
ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2015-02-11 中文名乱码是因为:FCKed ...
随机推荐
- ACE之通信的设计空间
本篇文章主要介绍 .无连接的和面向连接的协议之间的对比 .同步的和异步的消息交换之间的对比. .消息传递和共享内存之间的对比. 1:无连接和面向连接的协议对比 协议(protocol)是指一组规则,这 ...
- rocketmq番外篇(一):开发命令行
匠心零度 转载请注明原创出处,谢谢! 说在前面 虽然是以rocketmq引出的开发命令行,但是任何java应用如果需要都可以借鉴引用,也是通用技术. 主题 rocketmq使用例子 Apache Co ...
- 六,前端---viewport
移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,再具体一点,就是浏览器上用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区 ...
- 探寻 webpack 插件机制
webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...
- [LeetCode] Design Log Storage System 设计日志存储系统
You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...
- [原创]手把手教你写网络爬虫(5):PhantomJS实战
手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...
- [HNOI 2016]网络
Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做 一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有 ...
- [TJOI 2016&HEOI 2016]排序
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- python实现tab键自动补全
一.查询python安装路径,一般默认是/usr/lib64/ [root@host2 ~]# python Python (r266:, Jul , ::) [GCC (Red Hat -)] on ...
- C语言设计第一次作业
1 (1)题目:求圆面积和周长 (2)流程图: (3)测试数据及运行结果: (4)实验分析:暂时没问题. 2 (1)题目:输入一个四位年份,判断其是否是闰年.闰年的判别条件是该年年份能被4整除但不能被 ...