今天做一个gdk到utf-8的转化,做了一天,都没有出结果,最后偶然的机会才发现原因:
网上找到的代码:
int utf8_gbk(char* src,int slen,char* dst,int dlen)
{
iconv_t cd;
cd = iconv_open("utf-8", "gb2312");
if (cd==0 || cd== (iconv_t)-1)
return -1;
memset(dst,0,dlen);
if (iconv(cd,&src,&slen, &dst,&dlen)==-1){
iconv_close(cd);
return -1;
}
iconv_close(cd);
return dlen;
}
我的代码:
//gb2312 -> utf-8,
//return:>0转化后得到的长度,<0失败原因
//point_data:input-需要转化的数据, output-返回转化后的数据
//data_length: point_data的大小
int utf8_gbk(char* point_data, int data_length)
{
iconv_t cd;
cd = iconv_open("utf-8", "gb2312");
if (cd==0 || cd== (iconv_t)-1)
return -1;
int alloc_length = data_length * 4;
char* point_alloc = malloc(alloc_length);
if (NULL == point_alloc){
return -2;
}
int length = strlen(point_data);
memset(point_alloc, 0, alloc_length);
if (iconv(cd, &point_data, &lenth, &point_alloc, &alloc_length)==-1){
free(point_alloc);
point_alloc = NULL;
iconv_close(cd);
return -1;
}
iconv_close(cd);
memset(point_data, 0, data_length);
int copy_length = data_length * 4 - alloc_length;
if (copy_length > data_length) {
free(point_alloc);
point_alloc = NULL;
return -3;
}
memcpy(point_data, point_alloc, copy_length );
free(point_alloc);
point_alloc = NULL;
return copy_length ;
}
原来准备只写带两个参数的函数, 一个地址,即是输入,又是输入,一个大小限制, 在函数最后把结果拷贝到参数地址中!
但是无论怎么测试,都得不出结果,
最后发现:iconv把地址给point_data的地址改为数据内容后面的地址了,
把point_alloc改为填充后的地址了!
最后导致 无论怎么样都无法获取到数据!
对于最上面从网络上copy的代码,虽然地址改变了, 但是源数据还是没有变,而且数据也填充到地址空间里面了!!!!