libiconv之iconv函数的正确使用方法
2013-05-20 17:19
363 查看
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/8951391
作者:hongchangfirst
hongchangfirst的主页:http://blog.csdn.net/hongchangfirst
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/8951391
作者:hongchangfirst
hongchangfirst的主页:http://blog.csdn.net/hongchangfirst
相关文章推荐
- libiconv之iconv函数的使用方法
- 如何正确使用控件的方法——使用“继承”思想的重要性
- Eclipse下Javassist正确使用方法代码解析
- Eclipse中使用jar包正确方法
- Java 中正确使用 hashCode 和 equals 方法
- Java 中正确使用 hashCode 和 equals 方法
- 正确使用stl map的erase方法
- Element UI 中可展开表格手风琴效果实现(toggleRowExpansion方法的正确使用方式)
- 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。解决方法
- Java ==运算符与equals方法的区别及intern方法的正确使用
- Svn正确的使用方法
- PS2正确使用方法
- 易混HTML Entities与正确使用方法
- delphi ComboBox AddObject 正确使用方法
- 用javah导出类的头文件常见的错误及正确的使用方法
- GRE写作模板正确的使用方法
- Transform.Forward和Vector3.Forward的正确使用方法
- 技术讨论]mongodb驱动的正确使用方法
- nofollow和robots.txt正确使用方法
- [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法