赞
踩
近期的项目因为客户端用的是Unity3D(使用C#),服务端用的是C++(VS2013,Windows)。所以当他们相互传输中文字符串的时候不能正常工作。经过一番研究,把最终的解决方案分享出来。
本方案的思路就是保证服务端和客户端间的通信使用utf8编码。所以他们在给对方发中文数据时候都要转成utf8格式。
因为vs2013中C++的中文字符串(比如string str="测试"
)是GBK编码。所以服务端要把GBK转换成utf8格式,方法如下:
服务端代码示例一:
#include <string>
int main()
{
std::string str = GBK2UTF8("测试");
// ToDo,发送str给客户端
//.....
}
上述代码通过一个GBK2UTF8
函数(代码在文章末尾)把GBK编码的字符串转换成UTF8编码,然后再发给客户端。
服务端代码示例二
#include <string>
#pragma execution_character_set("utf-8") //设置字符串的格式为UTF-8
int main()
{
std::string str = "测试";
// ToDo,发送str给客户端
//.....
}
本方法使用了#pragma execution_character_set("utf-8")
编译选项后,上述代码中的“测试”字符串就是utf8格式。(注:VS2010以上版本才支持)
客户端代码示例
using System.Text;
//.....
//此处收到服务端的字符串数据inputBufs
string inputStr = Encoding.UTF8.GetString(inputBufs); // 用UTF8格式读取服务端发过来的数据
// TODO, 处理数据
//......
// 发送中文数据到服务端
string outputStr = "测试";
byte[] outputBufs = Encoding.UTF8.GetBytes(outputStr); // 把“测试”字符串编码为utf8格式
string GBK2UTF8(const string& strGBK)
{
wchar_t* str1;
int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, nullptr, 0);
str1 = new wchar_t[n];
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, nullptr, 0, nullptr, nullptr);
char * str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, nullptr, nullptr);
string strUTF8(str2);
delete[]str1;
delete[]str2;
return strUTF8;
}
string UTF82GBK(const string& strUTF8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, nullptr, 0);
unsigned short * str1 = new unsigned short[len + 1];
memset(str1, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (const char*)strUTF8.c_str(), -1, (LPWSTR)str1, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)str1, -1, nullptr, 0, nullptr, nullptr);
char *str2 = new char[len + 1];
memset(str2, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)str1, -1, str2, len, nullptr, nullptr);
string strGBK(str2);
delete[]str1;
delete[]str2;
return strGBK;
}
总结:在不同平台之间传输中文数据的时候,一定要明确知道平台之间编码的差异(如vs2013的c++默认编码为GBK,而C#为Unicode),然后转成统一的编码进行网络传输(推荐utf8)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。