使用C#调用GDAL的OGR读取s57文件,中文乱码问题

clevenhxn 2010-08-17 10:05:20
由于工作需要,本人需要解析电子海图s57 文件,经过一个阶段的学习,本人打算采用 gdal/ogr 来解析,本人是做C#开发的,对于C++ 不是很了解,解析的时候实现的是 gdal/ogr 对C#的接口,采用ogrinfo.cs 文件进行解析,结果发现,基本的属性都能查询出来,但是,由于s57文件中包含中文文字,解析出来的内容却不是中文,而是乱码。
本人想通过编码转换,转成中文文字,但是都不行,最好的状态发现 前面的文字是正确的,而后面的不正确,例如"十万吨级锚地",最后通过转成Unicode编码,显示的是"十万吨级**"(**表示显示的是乱码) 最后两位不对,这是什么原因呢?
有没有高手处理过遇到过这个问题呢? 是如何解决的呢?

在C++下解决方案也可以

解析s57文件可以用 iso8211.lib 解析,这里面遇到的问题和 gdal/ogr 一样,因为 gdal/ogr 中的核心内容就是用的 iso8211
在这上面解决的也可以呀
...全文
642 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
huxiaosky 2011-08-23
  • 打赏
  • 举报
回复
具体怎么解析啊,最近一直在琢磨这个东西.能把你的解析的程序给我一份吗.谢谢.
huxiaosky@163.com
sgeoffrey 2011-04-25
  • 打赏
  • 举报
回复
CSDN 新手,,我也想知道怎样用ogr读取风格信息啊 ,就是画多边形时的颜色信息。


最近在做海图解析,不知道怎么读取风格信息,高手帮忙解决啊
TearyWang 2010-12-25
  • 打赏
  • 举报
回复

string s = "乱码字符串";
byte[] srcBytes = System.Text.Encoding.UTF8.GetBytes(s); // 假设C#用的是UTF8编码,我不太确定
int count = 0;
// 计算到记录结束符号或字段结束符(0x1F、0x1E)的字节数
for (int i = 0; i < srcBytes.Length; i++)
{
if (srcBytes[i] != (byte)0x1F || srcBytes[i] != (byte)0x1E)
count++;
}
// 拷贝目标字符串,不包含记录或字段结束符
byte[] tagBytes = new byte[count];
for (int i = 0; i < tagBytes.Length; i++)
{
tagBytes[i] = srcBytes[i];
}
// 获得目标字符串
string tagStr = System.Text.Encoding.UTF8.GetString(tagBytes); // 假设C#用的是UTF8编码,我不太确定


这里,我不太确定的是,C#的内码用的是否为UTF8,若是UTF8则不用改什么,否则,需要在相关位置做更改。
xbt746 2010-10-29
  • 打赏
  • 举报
回复
windows下考虑使用api进行转换
好像是Multibyte什么的
swliujiao 2010-10-29
  • 打赏
  • 举报
回复
把读出来的字符串,用Encoding.Default转成byte数组,然后用Unicode获得字符串就是中文了
swliujiao 2010-10-14
  • 打赏
  • 举报
回复
您好,我现在也在做s57转shp,本想用ogr2ogr,但是发现转换的数据有问题,现在陷入了困境,您的程序能否给我一份,我不胜感激!谢谢了,swliujiao@sohu.com
starytx 2010-09-14
  • 打赏
  • 举报
回复
o ,忘了说了,那个源码是C++的,我也是用c++的
starytx 2010-09-14
  • 打赏
  • 举报
回复
s57文件的读取不是有一个国外的源码吗?我现在读取是没问题了(没试过国内地图),也弄明白了空间数据的关系,可不知道怎么处理颜色还有其他符号等信息,哪位大大有兴趣的话一起探讨,留个邮箱吧starytx@163.com
clevenhxn 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dujimache123 的回复:]

怎样用ogr读取风格信息啊 ,就是画多边形时的颜色信息。
[/Quote]
你是说ogr读取s52吗?不会吧?
dujimache123 2010-08-24
  • 打赏
  • 举报
回复
怎样用ogr读取风格信息啊 ,就是画多边形时的颜色信息。
gamemagic 2010-08-24
  • 打赏
  • 举报
回复
我建议你参考下s57文件结构,不要用任何库读取,而是自己写算法读取。这样哪里错了自己心里有个数
最好用unicode编码字符串
clevenhxn 2010-08-24
  • 打赏
  • 举报
回复
我一直没解决,你也遇到和我相同的问题吗?你也在弄s57?
dujimache123 2010-08-23
  • 打赏
  • 举报
回复
我也遇到这个问题了,不知你解决了吗,能把转中文的C#代码分享给我吗??谢谢。
dujimache123 2010-08-23
  • 打赏
  • 举报
回复
或者给我指点资料,我都不知道从哪下手。
dujimache123 2010-08-23
  • 打赏
  • 举报
回复
能把你的解析代码发我看看嘛?zhiwei1ffs@163.com
icansaymyabc 2010-08-17
  • 打赏
  • 举报
回复
你多贴几个错误示例出来,连乱码也要贴出来,看看有没有规律可循
clevenhxn 2010-08-17
  • 打赏
  • 举报
回复
我调用的是 gdal/ogr 中的样例代码 ogrinfo.cs 其中用到了个方法GetFieldAsString 该方法返回的是 char* 如果在C++下,可以考虑直接用 wchar* 强制转 就能显示正常的中文了,但是我是在C#下做的程序
gdal/ogr 采用的是swig封装,返回的是string 显示为乱码, 如何写程序才能使 乱码变中文呢?我怀疑swig封装之后会不会有损失?
代码转载自:https://pan.quark.cn/s/11d565366452 【USB转I2C/IIC适配器上位机应用程序】是一种针对I2C(Inter-Integrated Circuit)通信协议而构建的工具,其通过USB端口将个人计算机转变为能够与I2C设备进行交互的控制器。该适配器使开发人员与工程师能够便捷地对遵循I2C协议的芯片执行读取和写入任务,因此在硬件构建和测试阶段能够显著提升效率,对于核实I2C接口芯片的工作性能具有特别的价值。 I2C协议是由飞利浦(现NXP半导体)于1980年代初创立的一种双线式串行总线,其目的是用于连接微控制器及其他外围设备。该协议仅需两条信号线(SDA - 数据线,SCL - 时钟线)即可完成多设备间的通信,大幅度削减了电路板上的布线需求,从而降低了生产成本。I2C协议提供多种速度等级,涵盖标准模式(100kbps)、快速模式(400kbps)以及高速模式(3.4Mbps),旨在满足不同场景下的应用要求。 Ginkgo USB转I2C适配器是这项技术的具体应用实例,它提供了一个物理接口,用于将USB端口转换为I2C端口。适配器内部装配有一个微控制器单元,该单元负责处理从USB到I2C的信号转换,并且通过USB线路向计算机传输信息,同时接收来自计算机的指令以操控I2C总线。这种设计使用户无需具备深厚的硬件知识,仅需借助上位机软件即可实现对I2C设备的操控。 Ginkgo I2C Adapter Classic是与该适配器相配套的软件,通常包含以下几项核心功能: 1. 设备识别:自动检测并建立与USB转I2C适配器的连接。 2. 总线探查:扫描I2C总线上所连接的设备地址,有助于准确定位设备的位置。 3. 读写指令...
代码转载自:https://pan.quark.cn/s/4c053f9292d9 在Android应用程序的设计与实现过程中,有时需要借助C或C++语言所具备的高性能特点,此时就必须借助Android Studio的NDK(Native Development Kit)工具来对C/C++代码进行编译,进而生成SO(Shared Object)动态链接库文件。本篇文章将详尽阐述在Android Studio环境下如何执行这一流程。 我们首先需要掌握Android Studio项目的基本组织架构。在Android Studio的`app`文件夹内,存在一个名为`src`的子文件夹,该文件夹通常包含了`main`以及其他相关源代码目录。在`main`文件夹中,除了我们常见的`java`文件夹外,还设立了一个`jniLibs`文件夹,此文件夹专门用于存储SO文件。除此之外,还有一个`jni`文件夹,它是用来存放C/C++源代码的地方。 为了实现C/C++代码的编写与编译,我们必须在`build.gradle`文件中配置NDK的支持。打开`app/build.gradle`文件,在`defaultConfig`部分中嵌入以下内容: ```groovy externalNativeBuild { ndkBuild { path src/main/jni/Android.mk } } ``` 这段内容明确指示Android Studio去何处寻找`Android.mk`文件,该文件是一种Makefile的变体,主要用于设定编译规则和编译目标。 接下来,我们需要创建`Android.mk`文件。在这个文件中,我们将明确指定源代码文件、编译选项以及要生成的库名称。一个基础的...
内容概要:本文围绕麦克斯韦旋度方程的差分形式在平面极化磁场中的应用展开深入研究,并通过Matlab代码实现相关数值仿真。研究的核心是将经典的麦克斯韦方程组转化为适用于数值计算的有限差分格式,构建离散化数学模型,进而模拟和分析平面极化条件下磁场的空间分布特征与时间演化规律。文中系统阐述了差分方法的理论基础与数学推导过程,详细说明网格划分、边界条件设定及迭代求解策略,最终利用Matlab编程实现电磁场的可视化仿真,有效验证了差分方法在求解复杂电磁场问题中的准确性与可行性。该研究不仅加深了对电磁波传播机理的理解,也为电磁器件的设计优化与工程仿真提供了可靠的数值分析手段。; 适合人群:具备电磁场与电磁波理论基础,熟悉偏微分方程数值解法,且掌握Matlab编程技能的电气工程、物理学、应用数学等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入掌握麦克斯韦旋度方程的有限差分法基本原理及其在二维平面磁场仿真中的具体实施步骤;②学习如何利用Matlab进行电磁场问题的建模、编程求解与结果可视化;③为后续开展更复杂的电磁兼容、天线设计或光子晶体等领域的数值模拟研究奠定坚实的技术基础。; 阅读建议:建议读者结合经典电磁场理论教材,透彻理解麦克斯韦方程组的物理内涵,然后循序渐进地跟进文中的差分格式推导过程,务必动手复现并调试所提供的Matlab代码,通过调整参数观察仿真结果的变化,从而深刻领悟数值方法的实质与应用技巧。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧