《libiconv字符集转换库使用方法》一文中说到了libiconv可以实现不同字符集的转换。比如GBK转BIG5等。在项目中因为需要,找到这个库。可是这个库在C#中没有很好的支持。不过,想着既然是C++的库,那只要动态加载DLL的接口就好了。可是调用并不顺利,传进去的IntPtr或者byte数组总是拿不到数据。后面回到了C++的方式去调用,几经调试,总算找到了原因。
是iconv接口在转换完成后,指针的位置往后移了。而在C#中调用DLL后回来的指针,已经是移动后的,所以拿不到所要的数据。
经过多种尝试,没有办法将指针移回到原位。

后来,通过C++的二次封装,在C++中将指针的位置移到了原来的位置,再用C#来调用,总算达到了目的。

#include <fstream>
//包函 libiconv库头文件
#include "iconv.h"//导入 libiconv库
#pragma comment(lib,"libiconv.lib")
using namespace std;#define DLL_EXPORT extern "C" __declspec(dllexport)DLL_EXPORT int ChangeCode( const char* pFromCode,const char* pToCode,const char* pInBuf,size_t* iInLen,char* pOutBuf,size_t* iOutLen )
{   size_t outLenTemp=*iOutLen;iconv_t hIconv = iconv_open( pToCode, pFromCode );if ( -1 == (int)hIconv ){return    -100;//打开失败,可能不支持的字符集 }//开始转换 int iRet = iconv( hIconv, (const char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen );if (iRet>=0){pOutBuf=pOutBuf-(outLenTemp-*iOutLen);//转换后pOutBuf的指针被移动,必须移回到起始位置}else{iRet=-200;}//关闭字符集转换 iconv_close( hIconv );return iRet;
}

C#调用的部分

  /// <summary>/// 字符器转换./// 每次转换都需要打开转换器、字符集转换、关闭转换器。/// </summary>/// <param name="pFromCode">源字符集编码</param>/// <param name="pToCode">目标字符集编码</param>/// <param name="pInBuf">待转换的内容</param>/// <param name="iInLen">待转换的长度。转换成功后,将变成0.</param>/// <param name="pOutBuf">转换后的内容</param>/// <param name="iOutLen">转换长度。转换成功后,将变成原值减去转换后的内容所占空间的长度</param>/// <returns></returns>[DllImport("CharsetConvert.dll", CallingConvention = CallingConvention.Cdecl)]public static extern int ChangeCode(string pFromCode,string pToCode,byte[] pInBuf,ref int iInLen,byte[] pOutBuf,ref int iOutLen);
   private void buttonOneConvert_Click(object sender, EventArgs e){string toCode = "BIG5";string fromCode = "GBK";string inStr = "國k";byte[] inBuf = Encoding.Default.GetBytes(inStr);byte[] outBuf = new byte[100];int inLen = inBuf.Length;int outLen = outBuf.Length;int result = CharsetConvter.ChangeCode(fromCode, toCode, inBuf, ref inLen, outBuf, ref outLen);if (result < 0){MessageBox.Show("转换失败");}else{String outStr = Encoding.GetEncoding("BIG5").GetString(outBuf);MessageBox.Show(outStr);}}

转载于:https://www.cnblogs.com/sparkleDai/p/7605004.html

libiconv字符集转换库在C#中的使用相关推荐

  1. libiconv字符集转换库使用方法

    在软件开发中不可避免的需要用到字符集的转换:转换方法很多如自行编写字符集转换库.利用Windows提供之MultiByteToWideChar函数等:自行编写相对周期较长,而利用MultiByteTo ...

  2. mysql 数据库字符集转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

  3. php中iconv函数使用_字符集转换编码

    php中iconv函数介绍 iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库. 1.下载libiconv函数库http://ftp.gnu.org/pub/gnu/lib ...

  4. Python扩展库scipy.misc中图像转换成pillow图像

    众所周知,在数字图像处理领域中有很多基准测试图像,这些图像用来作为科研人员PK自己的算法时的参考,给大家提供一个公平的样本,针对同一个问题进行处理时,可以用这些基准图像做实验,比较常见的应该就是len ...

  5. mysql where条件中字符集转换

    现有两张表goods 和category(注意两张表的字符集不同): CREATE TABLE `goods` (`id` bigint(20) unsigned NOT NULL AUTO_INCR ...

  6. 使用iconv编程进行字符集转换

    使用iconv编程进行字符集转换 摘自:https://www.cnblogs.com/lancidie/archive/2013/04/12/3016965.html Linux上进行编码转换时,既 ...

  7. 【MySQL】故障分析 | MySQL 优化案例 - 字符集转换

    1.概述 好文章转载:故障分析 | MySQL 优化案例 - 字符集转换 一.背景 开发联系我,说是开发库上有一张视图查询速度很慢,9000 条数据要查 10s,要求我这边协助排查优化. 二.问题 S ...

  8. Unicode以及字符集转换

    曾经碰到一个问题, 项目需要支持日文操作系统,但是没有编译成unicode程序. 然后在一个解析用户输入路径的地方出问题了. 原因是日文的"表"这个汉字,日文编码格式下,低字节和反 ...

  9. python字符集_Python任意字符集转换

    在python处理文本的过程中,经常会有文本字符集转换的情况, 而我们希望用一个方法,不用关心文本原本的字符集是什么样的,直接转换成想要的任何字符集就可以了. 方法一: import chardet ...

最新文章

  1. MEMS惯性传感器有哪些趋势?
  2. spring调用存储过程
  3. Mol Cell Proteomics. |胡丹丹| 雷公藤红素通过SIRT1-FXR 信号通路保护胆汁淤积性肝损伤...
  4. PHP面向对象的进阶学习
  5. 排查指南 | 当 mPaaS 小程序提示“应用更新错误(1001)”时
  6. python sphinx_Python Sphinx使用实例及问题解决
  7. labeme批量转换json文件_Python实现markdown文件批量转换为word
  8. 山石网科-Hillstone-L2TP-***之配置终结篇
  9. 胡寿松《自动控制原理》课后习题重点题与考研刷题指南(ch1-4)
  10. 如何打开KML和KMZ文件并与卫星影像叠加
  11. chrome插件开发之调试
  12. 各种数据传输总线的传输速率是多少?这些速率是如何计算出来的?数据传输的速率单位有哪些以及有哪些区别?Bps,bps,Byte/s,bit/s,kbps等等
  13. 热加工作业考研题目答案分享——metal casting 1
  14. 微信小程序学习day02-WXSS 模板样式
  15. 短裙高跟丝袜外拍,真的很漂亮哦!
  16. 数据资产价值评估常用方法及对比
  17. Android 基站定位源代码
  18. 推荐16个免费开源的商业智能工具
  19. 容量法和库仑法的异同点_卡尔-费休容量法与库仑法的区别
  20. [毕业设计]大数据电影数据分析可视化

热门文章

  1. resultset 的指针报错原因
  2. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
  3. 关于Unable to load annotation processor factory 的故障
  4. Silverlight使用RSA加密socket tcp通讯数据
  5. Marquee无间隙滚动(二)
  6. Linux 后台开发常用命令目录(更新 ing)
  7. 微信生成专属海报(专属二维码)
  8. Mybatis 源码分析(一)配置文件加载流程
  9. Assembly Manifest 通俗简易手册
  10. 在firefox中backspace返回键不能回到之前的页面