作为编程接口的iconv包括3个函数:

iconv_open函数:用于初始化用于转换的内部缓冲区,指明需要从何种编码方式转换到哪一种。

iconv函数:进行实际的转换,需要给出两个间接缓冲区指针和剩余字节数指针。该函数需要更新所有相关信息,因此将不可改写的指针传递给iconv是错误的。

iconv_close函数:释放iconv_open函数的缓冲区。

注:由于没有办法获取转换之后需要的内存大小,所以可能会造成内存空间的浪费!


iconv_open函数

#include <iconv.h>
iconv_t iconv_open(const char* tocode,const char* fromcode);

描述:

iconv_open()函数申请一个转换描述符,转换字符序列从编码fromcode到编码tocode转换描述符包含转换状态,调用iconv_open创建以后,转换状态处于初始状态,调用iconv函数以后改变转换描述符的转换状态,(意味着转换描述符不能在多线程中同时使用)


返回值:

iconv_open函数返回一个新申请的转换描述符,出错时,返回(iconv_t)-1;

iconv函数

#include <iconv.h>
size_t iconv(iconv_t cd, char **restrict inbuf, size_t *restrict inbytesleft, char **restrict outbuf, size_t *restrict outbytesleft);   


参数说明:

inconv_t cd:函数iconv_open()分配的编码转换句柄。

char **restrict inbuf:指向需要编码转换的缓冲区。(其中关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。)

size_t *restrict inbytesleft:inbuf中还需要编码转换的字节数。

char **restrict outbuf:指向存放转码的缓冲区。

size_t *restrict outbytesleft:outbuf中还可以存放转码的字节数,也就是outbuf中的剩余空间。


返回值:

调用成功,返回转换的字节数(不可逆转调用的字节数,可逆转调用的字节数不包括在内)

调用失败,返回-1,并设置相应的errno。

注:iconv()是逐步扫描inbuf,每转换一个字符,就增加inbuf,减少inbytesleft,并将结果存入outbuf,结果字节数存入outbytesleft

常见的三种情况:

情况一: inbuf不为空,而且*inbuf也不为空

此时,进行正常的编码转换

遇到下列情况将停止扫描并返回:

(1)inbuf中碰到非法的多字节序:这种状况下,会设置errno为EILSEQ,并返回-1;

(2)inbuf字节被完全转换:这种状况下,返回转换的字节数

(3)inbuf中碰到不完整的多字节序:这种状况下,设置errno为EINVAL,并返回-1;

(4)outbuf中没有足够的空间以进行下一次的字符转换:这种状况下,设置errno为E2BIG,并返回-1;

情况二:inbuf == NULL,或者*inbuf == NULL;但outbuf == NULL,且*outbuf != NULL

iconv会设置转换状态为初始状态,并保存转换序列到*outbuf。如果outbuf空间不足,errno会设置为E2BIG,返回(size_t) (-1);

情况三:INBUF == NULL,或者*inbuf == NULL; 并且outbuf == NULL,*out == NULL

iconv设置转换状态为初始状态

iconv_close函数

int iconv_close(iconv_t cd); 

描述:
此函数用于关闭转换句柄,释放资源。

示例代码:

封装一个转换类型:

class CCodeConverter
{public:CCodeConverter(const char * fromCode, const char * toCode){hCodeConverter=iconv_open(toCode, fromCode);}~CCodeConverter(){iconv_close(hCodeConverter);}//进行转换int convert(char * srcBuf, int srcLen, char * destBuf, int destLen){//返回转换的字符个数int nConv=iconv(hCodeConverter, &srcBuf, (size_t *)&srcLen, &destBuf, (size_t *)&destLen);//如果错误,则获取错误码nErr=errno;return nConv;}//获取错误信息int getErrInfo(){switch(nErr){case E2BIG:{printf("errno:E2BGI(OutBuf空间不够)\n");break;}case EILSEQ:{printf("errno:EILSEQ(InBuf多字节序无效)\n");break;}case EINVAL:{printf("errno:EINVAL(有残留的字节未转换)\n");break;}default:break;}return nErr;}private://转换句柄iconv_t hCodeConverter;int nErr;
};

以utf-8转为utf-16为例

</pre><p><pre name="code" class="cpp">int main()
{int srcLen=12;char * srcBuf=new char[srcLen];memset(srcBuf, 0, srcLen);strcpy(srcBuf, "BaiSe");int destLen=2*srcLen;char * destBuf=new char[destLen];memset(destBuf, 0, destLen);CCodeConverter cv=CCodeConverter("utf-8", "utf-16");int nRet=cv.convert(srcBuf, srcLen, destBuf, destLen);if(nRet<0){cv.getErrInfo();return -1;}printf("转换成功\n");return 0;
}

多种国际编码格式之间进行文本内码的转换相关推荐

  1. 编码格式之间进行文本内码转换的库

    iconv iconv是一个计算机程序以及一套应用程序编程接口的名称.它的作用是在多种国际编码格式之间进行文本内码的转换.目前版本为2.3.26,支持的内码包括: Unicode相关编码,如UTF-8 ...

  2. GBK与Big5之间如何做内码转换?

    GBK与Big5之间如何做内码转换? this is a question posted on 2012-08-19 10:11 lexus 阅读(...) 评论(...) 编辑 收藏 转载于:htt ...

  3. C++编程技巧:内码的转换技术

    2009-03-25 来源:网络 一.基本概念 GB2312码 全称是GB2312-80<信息交换用汉字编码字符集基本集>,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中 ...

  4. 用C语言实现常见的三种中文内码转换

    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持.网上也有很多中文内码的转 ...

  5. c语言字符的内码是怎么表示,用C语言实现常见的三种中文内码转换

    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持.网上也有很多中文内码的转 ...

  6. 常见的三种中文内码转换代码

    作者:ccrun    更新:2005-10-13    浏览:11660 常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都 ...

  7. C++常见的三种中文内码转换代码

    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持.网上也有很多中文内码的转 ...

  8. mysql外码内码定义_刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系...

    简体汉字编码中区位码.国标码.内码.外码.字形码的区别及关系 GB2312.GBK.GB18030等GB类汉字编码方案的具体实现方式是怎样的?区位码是什么?国标码是什么?内码.外码.字形码又是什么意思 ...

  9. 刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系

    简体汉字编码中区位码.国标码.内码.外码.字形码的区别及关系 GB2312.GBK.GB18030等GB类汉字编码方案的具体实现方式是怎样的?区位码是什么?国标码是什么?内码.外码.字形码又是什么意思 ...

最新文章

  1. Vue+Openlayers实现绘制线段并测量距离显示
  2. 7-68 阶乘计算 (15 分)
  3. 深入浅出Java多线程
  4. olive videoeditor开源跨平台视频编辑器
  5. mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大
  6. openshift 3 mysql_最新OpenShift免费空间申请与使用教程-1G内存1G空间支持PHP和MysqL
  7. 一个小技巧让你轻松处理Selenium处理滚动条和元素聚焦
  8. 以代码为实例讲解sizeof函数易混淆的用法
  9. 用python语言怎么打出菱形的*号_Python打印“菱形”星号代码方法
  10. 图像滤镜艺术---ZPhotoEngine超级算法库
  11. 10个低成本真实兼职,在家就能干的兼职有那些?
  12. 携手聚力 共赢数智未来丨物通博联招募生态合作伙伴
  13. 三件套都有什么_床上四件套和三件套都包括哪些物品?床上四件套选购指南
  14. 使用formality的技巧
  15. 阿里云使用笔记(一):从零开始配置阿里云GPU服务器训练深度学习模型
  16. python读取svg文件_使用python创建SVG
  17. xctf攻防世界 MISC高手进阶区 misc1
  18. python运行selenium时浏览器闪退情况:
  19. Jenkins之配置自动发送邮件
  20. AnyLogic的相关操作第一天

热门文章

  1. 4月21日王者服务器为什么会维护中,王者荣耀:4.15-4.21王者新鲜事
  2. 解析函数的导函数仍然解析
  3. C语言计算某年某月有多少天
  4. 牛顿迭代法求数的平方根
  5. 阿里分布式事务seata
  6. Dubbo+Flutter在线交友平台教程第六天 完善小视频功能以及即时通讯
  7. SonarQube 指标定义
  8. 街电西安设备消毒进社区,细致入微保障服务安全
  9. python判断闰年(leap year)
  10. 搭建OpenStack多节点的企业私有云平台——基础基础环境搭建