气人的iconv

今天做一个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的代码,虽然地址改变了, 但是源数据还是没有变,而且数据也填充到地址空间里面了!!!!

 

 

posted on 2014-07-11 18:27  风鸟  阅读(450)  评论(0编辑  收藏  举报

导航