简述
在使用Windows平台MFC的Socket与Linux平台Qt的Socket通信时遇到中文乱码问题,最后发现是两边的编码格式不一致导致的乱码,最后使用了iconv把GBK编码转为了UTF-8编码格式再输出。
主要内容
头文件#include <iconv.h>
作为编程接口的iconv包括3个函数,linux下函数原型如下:
extern iconv_t iconv_open (const char *__tocode, const char *__fromcode);
extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,
size_t *__restrict __inbytesleft,
char **__restrict __outbuf,
size_t *__restrict __outbytesleft);
extern int iconv_close (iconv_t __cd);
iconv_open函数用于初始化转换的内部缓冲区,指明需要从何种编码方式转换到哪一种编码方式。
iconv函数进行实际的转换,需要给出两个间接的缓冲区指针和剩余字节数指针,该函数需要更新所有相关信息,因此将不可改写的指针传递给iconv是错误的。
iconv_close函数释放iconv_open函数的缓冲区。
接口
当你执行过iconv以后,*buff所指向的内存空间位置已经被改掉了,就不是*dst所指向的内存地址,所以你任何时候去读*buff,都是读不到任何iconv后的数据的(都在*dst这个指针放着呢),所以你应该 预先备份*dst的数据,用*buff去转换,转换完成后去读*dst内存就可以了。
/********************************************************
* 函数名称: gbk2utf8
* 函数功能: Windows的GBK编码格式转Linux的UTF-8编码格式
* 输入参数: src GBK编码格式字符串
* 输出参数:
* 日 期: 2019.08.22
* 作 者:
********************************************************/
QString gbk2utf8(char *src)
{
// 获取字符串长度
size_t strLen = strlen(src);
// 开辟新的内存空间存放转换后的内容
size_t dstLen = strLen * 2;
char* dst = new char[dstLen];
char* buff = dst;
memset(dst, 0, dstLen);
// 当你执行过iconv以后,*buff所指向的内存空间位置已经被改掉了,就不是*dst所指向的内存地址
// 所以你任何时候去读*buff,都是读不到任何iconv后的数据的(都在*dst这个指针放着呢)。
// 所以你应该 预先备份*dst的数据,用*buff去转换,转换完成后去读*dst内存就可以了
iconv_t cd = iconv_open("UTF-8","GBK");
iconv(cd, &src, &strLen, &buff, &dstLen);
iconv_close(cd);
QString sUtf8 = QString::fromLocal8Bit(dst);
delete[] dst;
return sUtf8;
}