libiconv字符集转换库用法》一文中说到了libiconv能够实现不同字符集的转换。

比方GBK转BIG5等。在项目中由于须要,找到这个库。但是这个库在C#中没有非常好的支持。只是,想着既然是C++的库。那仅仅要动态载入DLL的接口就好了。但是调用并不顺利。传进去的IntPtr或者byte数组总是拿不到数据。后面回到了C++的方式去调用。几经调试,总算找到了原因。

是iconv接口在转换完毕后。指针的位置往后移了。而在C#中调用DLL后回来的指针,已经是移动后的,所以拿不到所要的数据。

经过多种尝试,没有办法将指针移回到原位。

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

  1. #include <fstream>
  2. //包函 libiconv库头文件
  3. #include "iconv.h"
  4.  
  5. //导入 libiconv库
  6. #pragma comment(lib,"libiconv.lib")
  7. using namespace std;
  8.  
  9. #define DLL_EXPORT extern "C" __declspec(dllexport)
  10.  
  11. DLL_EXPORT int ChangeCode( const char* pFromCode,
  12. const char* pToCode,
  13. const char* pInBuf,
  14. size_t* iInLen,
  15. char* pOutBuf,
  16. size_t* iOutLen )
  17. {
  18.  
  19. size_t outLenTemp=*iOutLen;
  20.  
  21. iconv_t hIconv = iconv_open( pToCode, pFromCode );
  22. if ( -1 == (int)hIconv )
  23. {
  24. return -100;//打开失败。可能不支持的字符集
  25. }
  26.  
  27. //開始转换
  28. int iRet = iconv( hIconv, (const char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen );
  29. if (iRet>=0)
  30. {
  31. pOutBuf=pOutBuf-(outLenTemp-*iOutLen);//转换后pOutBuf的指针被移动,必须移回到起始位置
  32. }
  33. else
  34. {
  35. iRet=-200;
  36. }
  37.  
  38. //关闭字符集转换
  39. iconv_close( hIconv );
  40. return iRet;
  41. }

C#调用的部分

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

libiconv字符集转换库在C#中的使用的更多相关文章

  1. mysql已有数据字符集转换

    下面模拟把latin1字符集的数据转换为utf8字符集 一.创建测试表和测试数据: 1.修改会话级别的连接字符集 mysql > set names latin1; 查看一下: 2.创建测试表: ...

  2. 部署OGG时字符集转换问题--oracle to oracle已验证,其他异构环境应当也适用

    之前在安装OGG总是遇到字符集问题,尤其是多源端对一个目标端时,源端字符集不同,导致出现字符集问题 无法同步数据,查阅了大量的园子资料,都说要设置复制或抽取进程中SETENV (NLS_LANG=AM ...

  3. iOS 手动打造JSON Model转换库

    前一段时间学习了Runtime,对类和对象的结构,和一些消息转发有一些自己的理解,现在希望简单的应用下,就决定自己写一个简单的JSON与Model的相互转化,现在总结下. 建议查看 参考资料 :Run ...

  4. 利用boost做string到wstring转换,以及字符集转换 - Error - C++博客

    利用boost做string到wstring转换,以及字符集转换 - Error - C++博客 利用boost做string到wstring转换,以及字符集转换 #include <boost ...

  5. Python图像处理库:PIL中Image,ImageDraw等基本模块介绍

    Python图像处理库:PIL中Image,ImageDraw等基本模块介绍 标签: 图像处理PILPYTHON 2016-08-19 10:58 461人阅读 评论(0) 收藏 举报  分类: 其他 ...

  6. 字符集转换: Ansi - Unicode

    字符集转换: Ansi - Unicode wstring AnsiToUnicode (const string& strSrc ) { /*!< 分配目标空间 */ ,strSrc. ...

  7. 字符集转换: Unicode - Ansi

    字符集转换: Unicode - Ansi string UnicodeToAnsi ( const wstring& wstrSrc ) { /*!< 分配目标空间, 一个16位Uni ...

  8. jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

    原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...

  9. 解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题

    解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题 在原来项目中导入全志v3相机的 ...

随机推荐

  1. (转)[原创]在ios android设备上使用 Protobuf (使用源码方式)

    自:http://game.ceeger.com/forum/read.php?tid=13479 如果你的工程只能以.Net 2.0而不能以.Net 2.0 subset运行,请看另外一个方法. 地 ...

  2. 深入剖析Android音频之AudioTrack

    播放声音能够用MediaPlayer和AudioTrack,两者都提供了java API供应用开发人员使用.尽管都能够播放声音.但两者还是有非常大的差别的.当中最大的差别是MediaPlayer能够播 ...

  3. Immediately-Invoked Puzzler

    The Poplar Puzzle-makers weren’t too impressed. They barely noticed your simple and beautiful array ...

  4. .NET破解之迅捷PDF转换器(续)

    在以前的博文<.NET破解之迅捷PDF转换器>中使用了暴力破解的方法,现在软件版本从5.0升级到6.3,所以也尝试用新的方法. 方法一:暴力破解法 如往常一样,查找搜索到关键的函数,即Is ...

  5. Asp.Net 之 <%%>相关内联代码块用法

    1.<%@ ... %> 用来添加命名空间引用,如:<%@ import namespace="system.data"> 2.<% ... %> ...

  6. vb.net 模拟UDP通信

    Imports System.Net Imports System.Text.Encoding Public Class Form1 Dim publisher As New Sockets.UdpC ...

  7. cat 命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...

  8. Android的startActivityForResult不起作用

    之前startActivityForResult一直用的好好的,今天发现怎么也不起作用.检查后发现有两点影响了. 1.android:launchMode="singleTask" ...

  9. java面试第十七天

    5.0新特性: 泛型: 泛型的形式: <E> <E extends 类型> <E extends Numner&comparator>  类名&接口 ...

  10. SPOJ 74. Divisor Summation 分解数字的因子

    本题有两个难点: 1 大量的数据输入.没处理好就超时 - 这里使用buffer解决 2 因子分解的算法 a)暴力法超时 b)使用sieve(筛子),只是当中的算法逻辑也挺不easy搞对的. 数值N因子 ...