iconv函数详细解释
2016-04-18 18:22
441 查看
最近在使用iconv函数,感觉iconv的函数参数很奇怪。仔细研究了一下,发现iconv实际上一个返回多个值的函数。此函数利用函数参数,同时返回了好几个值,每个函数参数既是入参,也是出参。详细解释如下:
函数参数比较奇怪的地方有:
1.inbuf 为什么是二级指针,而不是一级指针。
2.inbytesleft为什么是指针,而不是普通变量。
3.outbuf 为什么是二级指针,而不是一级指针。
4.outbytesleft 为什么是指针,而不是普通变量
原来,函数执行后,由于各种原因(输出缓冲区太小,输入字符串不是一种编码,而是含有多种编码),可能只转换了部分编码。这时返回值为-1,这时会改变后四个参数的值。另外,即使全部转换成功,这四个参数的值也要发生变化。
作为入参
第一个参数cd是转换句柄。
第二个参数inbuf是输入字符串的地址的地址。
第三个参数inbytesleft是输入字符串的长度。
第四个参数outbuf是输出缓冲区的首地址
第五个参数outbytesLeft 是输出缓冲区的长度。
作为出参
第一个参数cd是转换句柄。
第二个参数inbuf指向剩余字符串的地址
第三个参数inbytesleft是剩余字符串的长度。
第四个参数outbuf是输出缓冲区剩余空间的首地址
第五个参数outbytesLeft 是输出缓冲区剩余空间的长度。
这下,同学们应该明白为什么后四个参数,为什么要多取一级地址了吧。
下面是几个例子:
iconv的原型如下: size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
函数参数比较奇怪的地方有:
1.inbuf 为什么是二级指针,而不是一级指针。
2.inbytesleft为什么是指针,而不是普通变量。
3.outbuf 为什么是二级指针,而不是一级指针。
4.outbytesleft 为什么是指针,而不是普通变量
原来,函数执行后,由于各种原因(输出缓冲区太小,输入字符串不是一种编码,而是含有多种编码),可能只转换了部分编码。这时返回值为-1,这时会改变后四个参数的值。另外,即使全部转换成功,这四个参数的值也要发生变化。
作为入参
第一个参数cd是转换句柄。
第二个参数inbuf是输入字符串的地址的地址。
第三个参数inbytesleft是输入字符串的长度。
第四个参数outbuf是输出缓冲区的首地址
第五个参数outbytesLeft 是输出缓冲区的长度。
作为出参
第一个参数cd是转换句柄。
第二个参数inbuf指向剩余字符串的地址
第三个参数inbytesleft是剩余字符串的长度。
第四个参数outbuf是输出缓冲区剩余空间的首地址
第五个参数outbytesLeft 是输出缓冲区剩余空间的长度。
这下,同学们应该明白为什么后四个参数,为什么要多取一级地址了吧。
下面是几个例子:
int UTF8ToGBK(char* input, size_t& charInPutLen, char* output, size_t& charOutPutLen) { int ret =0; iconv_t cd; cd = iconv_open("GBK","utf-8"); ret = iconv(cd, &input, &charInPutLen, &output, &charOutPutLen); iconv_close(cd); return ret; } int UTF8ToGBK(const string& input, string& output) { int ret =0; size_t charInPutLen = input.length(); if( charInPutLen == 0) return 0; char *pSource =(char *)input.c_str(); size_t charOutPutLen = 2*charInPutLen; char *pTemp = new char[charOutPutLen]; memset(pTemp,0,2*charInPutLen); iconv_t cd; char *pSource =(char *)input.c_str(); char *pOut = pTemp ; cd = iconv_open("utf-8", "GBK"); ret = iconv(cd, &pSource, &charInPutLen, &pTemp, &charOutPutLen); iconv_close(cd); output = pOut; delete []pOut;//注意这里,不能使用delete []pTemp, iconv函数会改变指针pTemp的值 return ret; } int GBKToUTF8(char* input, size_t charInPutLen, char* output, size_t &charOutPutLen) { int ret = 0; iconv_t cd; cd = iconv_open("utf-8", "GBK"); ret = iconv(cd, &input, &charInPutLen, &output, &charOutPutLen); iconv_close(cd); return ret; } int GBKToUTF8(const string& input, string& output) { int ret = 0; size_t charInPutLen = input.length(); if( charInPutLen == 0) return 0; size_t charOutPutLen = 2*charInPutLen+1; char *pTemp = new char[charOutPutLen]; memset(pTemp,0,charOutPutLen); iconv_t cd; char *pSource =(char *)input.c_str(); char *pOut = pTemp; cd = iconv_open("utf-8", "GBK"); ret = iconv(cd, &pSource, &charInPutLen, &pTemp, &charOutPutLen); iconv_close(cd); output= pOut; delete []pOut; //注意这里,不能使用delete []pTemp, iconv函数会改变指针pTemp的值 return ret; }
相关文章推荐
- php中字符集转换iconv函数使用总结
- php使用iconv中文截断问题的解决方法
- Asp.Net中的字符串和HTML十进制编码转换实现代码
- JS 文件本身编码转换 图文教程
- PHP通过iconv将字符串从GBK转换为UTF8字符集
- java big5到gb2312的编码转换
- PHP转换文件夹下所有文件编码的实现代码
- linux系统上支持php的 iconv()函数的方法
- PHP下编码转换函数mb_convert_encoding与iconv的使用说明
- php 转换字符串编码 iconv与mb_convert_encoding的区别说明
- php iconv() : Detected an illegal character in input string
- php中iconv函数使用方法
- shell脚本中使用iconv实现批量文件转码的代码分享
- 使用iconv批量改变文件编码的shell脚本
- VC中实现GB2312、BIG5、Unicode编码转换的方法
- 详谈PHP编码转换问题
- PHP中mb_convert_encoding与iconv函数的深入解析
- PHP中iconv函数转码时截断字符问题的解决方法
- linux下为php添加iconv模块的方法
- PHP中iconv函数知识汇总