string server_common::charset_convert(const void *buf,uint32_t buf_len,const string &from_encode,const string &to_endcode)
{
auto iconv_id=iconv_open(to_endcode.c_str(),from_encode.c_str());
if(iconv_id==reinterpret_cast<iconv_t>(-1)){
fprintf(stderr,"%s\r\n",strerror(errno));
return string();
}
shared_ptr<char>in_buf(new char[buf_len+1],default_delete<char[]>());
strncpy(in_buf.get(),static_cast<const char *>(buf),buf_len);
const size_t in_len=buf_len;
const size_t out_len=buf_len*2;
shared_ptr<char>out_buf(new char[out_len+1],default_delete<char[]>());
char *in_tmp=in_buf.get();
char *out_tmp=out_buf.get();
char **pin=&in_tmp;
char **pout=&out_tmp;
memset(out_buf.get(),0,out_len);
size_t in_len_tmp=in_len;
size_t out_len_tmp=out_len;
if(iconv(iconv_id,pin,&in_len_tmp,pout,&out_len_tmp)==static_cast<size_t>(-1)){
fprintf(stderr,"%s\r\n",strerror(errno));
}
iconv_close(iconv_id);
string ret(out_buf.get(),out_len-out_len_tmp);
//printf("%s\r\n",ret.c_str());
return ret;
}