使用libiconv进行GBK和UTF-8的转换

本文介绍了libiconv库中iconv函数的使用误区,强调了参数*outbuf和*outbytesleft的重要性,指出在转换过程中这两个参数会自动更新,并提供了示例代码展示正确的转换操作。
摘要由CSDN通过智能技术生成

libiconv中的iconv函数是个很容易误用的函数,如果不仔细看iconv.h头文件中说明,按照习惯用法来用,基本上只能莫名其妙百思而不得其解了。

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

大眼一看这个方法,肯定以为第一个是句柄,第二个是要转换的源字符串开头,第3个是源字节串长度,第4个是转换后保存结果的缓冲区,第5个是转换的结果的长度。

于是就用了,于是就出现段错误或者错误的结果……。

仔细看了看说明

/* 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.
*/

才晓得第二个参数是源字符串开头没错,但iconv运行后,会改变*inbuf的值,同样也会增加*outbuf的值,也会减小*inbytesleft和*outbytesleft的值。

仔细看这些变量的名字,也能理解为什么是bytesleft而不是byteslen。所以第5个参数*outbytesleft对应的对象为保存结果的缓冲区的容量长度。一般初始化为源字符串长度的2倍即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值