linux编码转换
起因
在用windows的IOCP完成端口对epoll进行压力测试,发送中文,在Linux接收竟然乱码,是因为Linux系统默认编码是UTF-8,Windows则不是, 在命令行中输入:chcp --查看代码页 936,上网搜是gbk
在Linux系统,进行编码转换
先查看Linux系统支持的编码iconv --list | grep GB #查看支持GB开头的编码格式

主要使用3个函数,进行编码
//像打开文件一样,参数1是目标字符集,参数2是要源字符集
iconv_t iconv_open(const char *tocode, const char *fromcode);
//进行转换,cd是相当于文件描述符, inbuf为输入字符,inbytesleft为输入大小,outbuf为输出字符,outbytesleft是输出大小
ize_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
//使用完毕,要关闭
int iconv_close(iconv_t cd);
集成到代码中
//将gbk编码字符转换utf8字符集
int gbk2utf8(char *src,size_t *srclen,char *dest,size_t *destlen)
{
iconv_t result = iconv_open("UTF8","GBK"); //源字符集为gbk,目标字符集为utf8
if(result == (iconv_t)-1)
{
printf("open iconv failed:%s\n",strerror(errno));
return -1;
}
size_t rc = iconv(result,&src,srclen,&dest,destlen);
if(rc == (size_t)-1)
{
printf("iconv error:%s\n",strerror(errno)); iconv_close(result);
return -1;
}
iconv_close(result);
return 0;
}
//调用
char show_buf[1024];
size_t show_len = sizeof(show_buf);
size_t buf_len = (size_t)result;
gbk2utf8(buf,&buf_len,show_buf,&show_len);
printf(" recv msg:%s\n",show_buf);
效果

秋风
2017-03-17