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;
}