编码转换函数

 

int main()
{
	int length = 0;
	char* utf16xml = ReadFile("/home/project/iconv/utf16.xml",length);

	size_t inbuffer_length = length;
	char* inbuffer = new char[inbuffer_length+1];
	memset(inbuffer,0,inbuffer_length+1);
	memcpy(inbuffer,utf16xml,inbuffer_length);

	char* outbuffer = new char[inbuffer_length * 10+1];
	size_t outbuffer_length = inbuffer_length * 10+1;
	memset(outbuffer,0,outbuffer_length);

	char from[20] = {0};
	char to[20] = {0};

	sprintf(from,"utf-16//IGNORE");
	sprintf(to	,"utf-8//IGNORE");

	int result = code_convert(from,to,inbuffer,inbuffer_length+1,outbuffer,outbuffer_length);

	WriteFile("/home/project/iconv/utf8.xml",outbuffer,result);

	delete[] inbuffer;  inbuffer  = NULL;
	delete[] outbuffer; outbuffer = NULL;
	delete[] utf16xml;  utf16xml  = NULL;

	printf("返回值%d\n",result);

	return 0;
}


 

 
int code_convert(char *from, char *to, char *in_str, size_t inlen, char *out_str, size_t outlen)
{
	  int result = -1;
	  iconv_t cd;
	  int OLD_outlen = outlen;
	  char **pin	= &in_str;
	  char **pout 	= &out_str;

	  cd = iconv_open(to, from);
	  if(cd == 0)
		return -1;
	  memset(out_str, 0, outlen);

	  if(iconv(cd, pin, &inlen, pout, &outlen) == (size_t)-1)
	  {
		  if (errno == EINVAL)
		  {
			  //printf("剩余的内容 : %s\n",(*pin));
			  //memmove(pin, in_str, inlen);
		  }
		  else
		  {
			  perror("error :");
			  result = -1;
		  }
	  }


	  iconv_close(cd);
	  return (OLD_outlen - outlen); 
}

char* ReadFile(const char* filename,int& length)
{
	char* return_string = NULL;
    if(filename == NULL || filename[0] == '\0')
        return return_string;

    if(access(filename,F_OK) != 0)
    	return return_string;

    FILE* file;
    file = fopen(filename,"rb+");
    if(file == NULL)
        return return_string;


    fseek(file,0,SEEK_END);
    size_t buffersize = ftell(file);
    rewind(file);

    char* buffer = new char[buffersize+1];
    memset(buffer,0,buffersize+1);

    size_t read_len = fread(buffer,1,buffersize,file);

    printf("文件大小%ld\n",read_len);

    length = read_len;
    return buffer;

}

bool WriteFile(const char *fn, const char *data, int len)
{
	if(len == 0 || data == NULL || data[0] == '\0')
		return false;

	FILE *fp = fopen(fn, "wb+");
	if (fp == NULL)
		return false;

	fseek(fp, 0L, SEEK_END);
	fwrite(data, 1, len, fp);
	fclose(fp);

	return true;

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值