当前位置:网站首页 > 技术博客 > 正文

iconv_open函数



libiconv是一个开源的字符编码转换库,很多人使用它的转换函数时都会遇到问题,这次我们就来讲一下怎么正确使用。

iconv函数原型为:

size_t iconv (iconv_t cd,  char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); 

第一个参数是iconv的描述字,其实是指针,第二个参数表示下一次转换位置的指针的指针,第三个参数表示最多处理inbytesleft个字节,第四个参数表示下一次转换后输出的指针的指针,第五个参数表示最多输出outbutesleft个字节。

iconv函数一次转换一个多字节字符,每次字符转换,*inbuf增加已转换的字节数,*inbytesleft相应地减少已转换的字节数;对应地,*outbuf和*outbytesleft作相应的修改,同时修改cd的转换状态。iconv函数返回本次调用中转换的字符数,可逆的转换不计入。

注意iconv会改变这五个参数的值,所以我们在使用的时候一定要注意。使用的时候或者传副本,或者先把值记录下来,用后在恢复,个人比较倾向于第一种方法。而且由于iconv并不输出0,所以我们得自己加0.

如下例子:

char* utf8_input="伟大的hongchangfirst";

char* utf8_input_tmp=utf8_input;

size_t insize=strlen(utf8_input);

const size_t outsize=1024*1024;

char* gbk_input=new char[outsize];

char8 gbk_input_tmp=gbk_input;

size_t outsize_tmp=outsize;

size_t rc=iconv(converter, &utf8_input_tmp, &insize, &gbk_input_tmp, &outsize_tmp);

*gbk_input_tmp='0';


注意如果rc不为0,那就悲剧了,意味着我们不能够再从转换后的字符串t完全转换回去而不丢失信息了。

以下是iconv函数的英文注释:

/* Converts, using conversion descriptor ‘cd’, at most ‘*inbytesleft’ bytes
   starting at ‘*inbuf’, writing at most ‘*outbytesleft’ bytes starting at
   ‘*outbuf’.
   Decrements ‘*inbytesleft’ and increments ‘*inbuf’ by the same amount.
   Decrements ‘*outbytesleft’ and increments ‘*outbuf’ by the same amount. */


原文:http://blog.csdn.net/hongchangfirst/article/details/

作者:hongchangfirst

hongchangfirst的主页:http://blog.csdn.net/hongchangfirst



版权声明


相关文章:

  • 51单片机流水灯程序通过位移2024-12-15 12:01:00
  • 服务器硬件介绍2024-12-15 12:01:00
  • 预测模型有哪些?2024-12-15 12:01:00
  • 爬虫用什么软件2024-12-15 12:01:00
  • 137 138端口2024-12-15 12:01:00
  • verilog 移位运算2024-12-15 12:01:00
  • 网卡做bond02024-12-15 12:01:00
  • clash全局模式2024-12-15 12:01:00
  • 网页爬虫系统有哪些2024-12-15 12:01:00
  • fpga 异步fifo2024-12-15 12:01:00