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

近期的项目因为客户端用的是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格式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值