博客
关于我
libiconv字符集转换库在C#中的使用
阅读量:791 次
发布时间:2023-01-31

本文共 2202 字,大约阅读时间需要 7 分钟。

#OGLE lazım, 解决了问题!libiconv在C#中的应用之孑然抛 sleeves

在一次项目中, 我们需要将文本从GBK编码转换为BIG5编码。最初的想法是调用libiconv这个优秀的字符集转换库来实现这一点。然而, 发现这个库在C#中并不完全支持, 于是我们决定通过动态调用DLL的方式来实现。

经过一番折腾, 发现直接在C#中调用libiconv.dll并不能完全满足需求。问题的关键在于转换完成后, 系统会将指针移动到末尾, 导致我们无法正确获取原始数据。经过反复调试, 最终找出了问题根源。

为了解决这个问题, 我们采用了一种C++的巧妙解决方案。通过对libiconv的深入研究, 我们发现可以在C++层面对指针进行调整, 将其移回原始位置, 从而实现有效的数据获取。

详细方法说明

在C++代码中, 我们实现了一个函数ChangeCode, 导入了必要的libiconv库并进行了适当的类型映射。以下是关键代码段:

#include 
#pragma comment(lib, "libiconv.lib")using namespace std;typedef struct tagICONV { char* pFromCode; char* pToCode; char* pInBuf; size_t* iInLen; char* pOutBuf; size_t* iOutLen;} ICONV;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, &pInBuf, iInLen, &pOutBuf, iOutLen); if (iRet > 0) { // 转换后pOutBuf的指针位置已经被移动到末尾 pOutBuf = pOutBuf - outLenTemp * *iOutLen; // 移回起始位置 } else { iRet = -200; } iconv_close(hIconv); return iRet;}

C#调用接口

在C#中, 我们通过P/Invoke方式调用上述C++接口, 实现了一个简单的转换类CharsetConvter:

[Serializable]public class CharsetConvter{    public static extern int ChangeCode(        string pFromCode,        string pToCode,        byte[] pInBuf,        ref int iInLen,        byte[] pOutBuf,        ref int iOutLen    );    public static void Main()    {        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 = 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);        }    }}

实现效果

通过上述方法, 我们成功实现了从GBK到BIG5的文本转换。虽然过程充满挑战, 但通过深入研究和巧妙的手段调整, 最终实现了预期的效果。

这个方法不仅解决了我们当前的转换需求, 更为持续的打开了对字符集转换的理解之门。

此文转载自 sparkleDai的博客

你可能感兴趣的文章
Linq DataTable Group By 分组显示人员明细
查看>>
LINQ to DB 开源项目教程
查看>>
Linq to Entities不识别方法
查看>>
linq to entity常用操作
查看>>
linq to js使用汇总
查看>>
Linq to object 技巧、用法集锦
查看>>
LINQ to Objects---立即执行的Enumerable类方法
查看>>
linq to sql 三层架构中使用CRUD操作
查看>>
LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
查看>>
LINQ Tutorial for Beginners
查看>>
Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据
查看>>
Linq 合并多个查询条件
查看>>
LINQ 左连接, 右连接, 全连接扩展
查看>>
linQ 查询
查看>>
linq-ef中如何批量删除
查看>>
LINQ/EF/Lambda 比较字符串日期时间大小
查看>>
LinQ—Lambda表达式
查看>>