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