由于最近在了解socket,就在windows和linux下尝试发送socket,结果发现linux下的服务端和windows下的客户端收到消息内容不一致.最后发现是编码不一致导致的问题.以前用qt写程序时并没有注重转换过程,所以纯c++编程时毫无办法,就去研究了下qt的源码和相关网上文献,结合之后,发现转换格式步骤如下
GBK->UTF-8:
GBK->unicode->UTF-8;
UTF-8->GBK:
UTF-8->unicode->GBK;
也就是说,无论是gbk转换到utf-8还是utf-8转换到gbk,都需要先转换成unicode.
代码如下
//需要包含windows.h等头文件
string GBK_2_UTF8(string gbkStr)
{
string outUtf8 = "";
int n = MultiByteToWideChar(CP_ACP, 0, gbkStr.c_str(), -1, NULL, 0);
WCHAR *str1 = new WCHAR[n];
MultiByteToWideChar(CP_ACP, 0, gbkStr.c_str(), -1,str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char *str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
outUtf8 = str2;
delete[]str1;
str1 = NULL;
delete[]str2;
str2 = NULL;
return outUtf8;
}
string UTF8_2_GBK(string utf8Str)
{
string outGBK = "";
int n = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, NULL, 0);
WCHAR *str1 = new WCHAR[n];
MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_ACP, 0, str1, -1, NULL, 0, NULL, NULL);
char *str2 = new char[n];
WideCharToMultiByte(CP_ACP, 0, str1, -1, str2, n, NULL, NULL);
outGBK = str2;
delete[] str1;
str1 = NULL;
delete[] str2;
str2 = NULL;
return outGBK;
}