linux编码转换

起因

  在用windows的IOCP完成端口对epoll进行压力测试,发送中文,在Linux接收竟然乱码,是因为Linux系统默认编码是UTF-8,Windows则不是,
  在命令行中输入:chcp --查看代码页 936,上网搜是gbk

在Linux系统,进行编码转换

  先查看Linux系统支持的编码
iconv --list | grep GB #查看支持GB开头的编码格式
iconv --list

 主要使用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