libiconv字符集转换库在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#中的使用相关推荐
- libiconv字符集转换库使用方法
在软件开发中不可避免的需要用到字符集的转换:转换方法很多如自行编写字符集转换库.利用Windows提供之MultiByteToWideChar函数等:自行编写相对周期较长,而利用MultiByteTo ...
- mysql 数据库字符集转换_字符集介绍及mysql数据库编码转换
一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...
- php中iconv函数使用_字符集转换编码
php中iconv函数介绍 iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库. 1.下载libiconv函数库http://ftp.gnu.org/pub/gnu/lib ...
- Python扩展库scipy.misc中图像转换成pillow图像
众所周知,在数字图像处理领域中有很多基准测试图像,这些图像用来作为科研人员PK自己的算法时的参考,给大家提供一个公平的样本,针对同一个问题进行处理时,可以用这些基准图像做实验,比较常见的应该就是len ...
- mysql where条件中字符集转换
现有两张表goods 和category(注意两张表的字符集不同): CREATE TABLE `goods` (`id` bigint(20) unsigned NOT NULL AUTO_INCR ...
- 使用iconv编程进行字符集转换
使用iconv编程进行字符集转换 摘自:https://www.cnblogs.com/lancidie/archive/2013/04/12/3016965.html Linux上进行编码转换时,既 ...
- 【MySQL】故障分析 | MySQL 优化案例 - 字符集转换
1.概述 好文章转载:故障分析 | MySQL 优化案例 - 字符集转换 一.背景 开发联系我,说是开发库上有一张视图查询速度很慢,9000 条数据要查 10s,要求我这边协助排查优化. 二.问题 S ...
- Unicode以及字符集转换
曾经碰到一个问题, 项目需要支持日文操作系统,但是没有编译成unicode程序. 然后在一个解析用户输入路径的地方出问题了. 原因是日文的"表"这个汉字,日文编码格式下,低字节和反 ...
- python字符集_Python任意字符集转换
在python处理文本的过程中,经常会有文本字符集转换的情况, 而我们希望用一个方法,不用关心文本原本的字符集是什么样的,直接转换成想要的任何字符集就可以了. 方法一: import chardet ...
最新文章
- MEMS惯性传感器有哪些趋势?
- spring调用存储过程
- Mol Cell Proteomics. |胡丹丹| 雷公藤红素通过SIRT1-FXR 信号通路保护胆汁淤积性肝损伤...
- PHP面向对象的进阶学习
- 排查指南 | 当 mPaaS 小程序提示“应用更新错误(1001)”时
- python sphinx_Python Sphinx使用实例及问题解决
- labeme批量转换json文件_Python实现markdown文件批量转换为word
- 山石网科-Hillstone-L2TP-***之配置终结篇
- 胡寿松《自动控制原理》课后习题重点题与考研刷题指南(ch1-4)
- 如何打开KML和KMZ文件并与卫星影像叠加
- chrome插件开发之调试
- 各种数据传输总线的传输速率是多少?这些速率是如何计算出来的?数据传输的速率单位有哪些以及有哪些区别?Bps,bps,Byte/s,bit/s,kbps等等
- 热加工作业考研题目答案分享——metal casting 1
- 微信小程序学习day02-WXSS 模板样式
- 短裙高跟丝袜外拍,真的很漂亮哦!
- 数据资产价值评估常用方法及对比
- Android 基站定位源代码
- 推荐16个免费开源的商业智能工具
- 容量法和库仑法的异同点_卡尔-费休容量法与库仑法的区别
- [毕业设计]大数据电影数据分析可视化