C++与C#网络传输中的编码转换

来源:互联网 发布:json.js下载 编辑:程序博客网 时间:2024/05/20 18:16

近期的项目因为客户端用的是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-8int main(){    std::string str = "测试";    // ToDo,发送str给客户端    //.....}

本方法使用了#pragma execution_character_set("utf-8")编译选项后,上述代码中的“测试”字符串就是utf8格式。(注:VS2010以上版本才支持)

客户端处理

客户端代码示例

using System.Text;//.....//此处收到服务端的字符串数据inputBufsstring inputStr = Encoding.UTF8.GetString(inputBufs);   // 用UTF8格式读取服务端发过来的数据// TODO, 处理数据//......// 发送中文数据到服务端string outputStr = "测试";byte[] outputBufs = Encoding.UTF8.GetBytes(outputStr);      // 把“测试”字符串编码为utf8格式

UTF8和GBK互相转换

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)。

0 0