GDAL的C#版本读取shp中,如果属性值中含有中文,读出来有可能是乱码的问题,根据SWIG生成的C#代码调试发现问题所在,在Ogr.cs文件中有这么一个函数,代码如下:

  internal static string Utf8BytesToString(IntPtr pNativeData)
{
if (pNativeData == IntPtr.Zero)
return null; int length = Marshal.PtrToStringAnsi(pNativeData).Length; //问题在这句
byte[] strbuf = new byte[length];
Marshal.Copy(pNativeData, strbuf, 0, length);
return System.Text.Encoding.UTF8.GetString(strbuf);
}

问题就出现在上面这句中,如果shp文件中dbf的编码是utf-8的时候,pNativeData实际上就是GDAL库读取到的一个const char*的地址,这个时候,使用Marshal.PtrToStringAnsi函数返回的长度会变小,下面举个栗子:

如果GDAL的C++库返回的const char* pszValue = “中”,那么pNativeData的值实际上就是pszValue这个地址,且用UTF8编码的时候,pszValue指针对应的内存中的信息应该是”E4 B8 AD 00 XX XX”,后面的XX表示其他的东西,只有前四个有用。

这时pNativeData的值就是上面这个”E4 B8 AD 00 XX XX”字符串的地址,调用下面这句,返回的值居然是2。明明一个3的字符串为啥长度是2,就因为这里长度变短,导致后面转string的时候丢失了信息,造成了乱码。

  int length = Marshal.PtrToStringAnsi(pNativeData).Length; //length = 2

本来想试下Marshal.PtrToString其他的函数,结果发现Marshal.PtrToStringAuto和Marshal.PtrToStringUni返回的长度都是16,就更不对了,没办法,用了一个笨办法,写了个循环来查找长度。修改后的代码如下:

  internal static string Utf8BytesToString(IntPtr pNativeData)
{
if (pNativeData == IntPtr.Zero)
return null; int nMaxLength = Marshal.PtrToStringAuto(pNativeData).Length;
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);
}

同理,将Gdal.cs、Osr.cs这两个文件里面的这个函数也修改,重新编译即可解决这个问题。

最后,如果与shp中dbf的编码使用GBK之类的编码,请设置SHAPE_ENCODING这个配置项,如果shp文件夹中有同名的cpg文件则可以不用设置,但是确保cpg文件中写的编码与dbf中的实际编码相对应。

GDAL C#读取shp中文属性值乱码问题的更多相关文章

  1. GDAL C#中文路径,中文属性名称乱码问题

    昨天写的博客,将C#读取shp中文属性值乱码的问题应该可以解决,博客地址为:http://blog.csdn.net/liminlu0314/article/details/54096119,然后又测 ...

  2. C# richtextbox 自动下拉到最后 方法 & RichTextBox读取txt中文后出现乱码

    C# richtextbox 自动滚动到最后  光标到最后 自动显示最后一行 private void richTextBox1_TextChanged(object sender, EventArg ...

  3. 解决ArcGIS Engine AE 读取shapefile中文属性乱码的一条偏方

    最近写一个程序,AE+C#,读shp字段属性,其中读到中文就乱码了 这个问题比较奇怪,用AE很多年了,怎么突然就乱码呢,用Arcmap打开,没乱码,证明不是数据问题 网上搜搜,很多人说是许可初始化的问 ...

  4. C++ AO读取shapefile的属性值

    C++ AO读取一个shapefile文件的所有属性值   #include "stdafx.h"   #include "iostream.h"   #inc ...

  5. C# 读取XML节点属性值

    xml文件格式如下: <?xml version="1.0" encoding="UTF-8" ?> <Product type=" ...

  6. java中Properties类及读取properties中属性值

    本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...

  7. PHP中使用DOM读取解析XML属性值一例

    先看XML文件结构,与常见的文件略有不同,数据并不是用闭合标签保存的,而是直接保存在属性值中. <?xml version="1.0" encoding="utf- ...

  8. php读取mysql中文数据出现乱码

    1.PHP页面语言本身的编码类型不合适,这时候,你直接在脚本中写的中文肯定是乱码,不用说数据库了:    解决方法:选择'UTF8'或者'gb2312',这样客户浏览器会自动选择并出现正确的中文显示. ...

  9. silverlight用Encoding.UTF8读取shape文件的中文属性值 出现乱码

    最近用Silverlight读取shape文件,读出的属性居然是乱码. 原因是:Silverlight不支持GB2312. 解决方案: 下载该地址的代码http://encoding4silverli ...

随机推荐

  1. [论文阅读] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications (MobileNet)

    论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 本文提出的模型叫Mobi ...

  2. 1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式

    首先我们知道,web api 是可以返回任意类型的,然后在输出的过程中转为(默认的)xml. 但是xml是比较费流量的,而且大多前端都是用json对接,所以我们也只能随大流,把它输出改成json. 不 ...

  3. PyCharm 2018 永久激活

    PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制. ...

  4. NC的开发模型

    2018-04-1622:35:12 NC的开发模型 系统前端为:客户UI代码,UI代码继承ToftPanel,UI代码通过调用远程组件和服务端进行交互,中间传递的数据模型为VO,远程组件调用底层的业 ...

  5. HTTP响应状态解析

    100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在请求完成后向客 ...

  6. 再深刻理解下web3.js中estimateGas如何计算智能合约消耗的gas量

    我们可使用web3.js框架的estimateGas函数获得一个以太坊智能合约的Gas估计值 ,通过执行一个消息调用或交易,该消息调用或交易直接在节点的VM中执行,并未在区块链中确认,函数会返回估算使 ...

  7. [NOI 2010]超级钢琴

    Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙 的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙 ...

  8. 【BZOJ2243】【SDOI2011】染色

    题意见试题传送门 解题思路:显然是题树剖题. 考虑用线段树维护区间端点颜色与颜色数,这样就可以方便的合并,注意查询的时候对端点的特殊处理即可. 时间效率最高为\( O (m \log^{2} n) \ ...

  9. NOIP2014-5-24模拟赛

    Problem 1 护花(flower.cpp/c/pas) [题目描述] 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时 ...

  10. Linux LCD 显示图片【转】

    转自:https://blog.csdn.net/niepangu/article/details/50528190 BMP和JPEG图形显示程序1)  在LCD上显示BMP或JPEG图片的主流程图首 ...