当前位置:   article > 正文

C++与C#网络传输中的编码转换_c++ 数据传输 utf-8

c++ 数据传输 utf-8

近期的项目因为客户端用的是Unity3D(使用C#),服务端用的是C++(VS2013,Windows)。所以当他们相互传输中文字符串的时候不能正常工作。经过一番研究,把最终的解决方案分享出来。

思路

本方案的思路就是保证服务端和客户端间的通信使用utf8编码。所以他们在给对方发中文数据时候都要转成utf8格式。

服务端处理

因为vs2013中C++的中文字符串(比如string str="测试")是GBK编码。所以服务端要把GBK转换成utf8格式,方法如下:

服务端代码示例一:

#include <string>
int main()
{
    std::string str = GBK2UTF8("测试");

    // ToDo,发送str给客户端
    //.....
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上述代码通过一个GBK2UTF8函数(代码在文章末尾)把GBK编码的字符串转换成UTF8编码,然后再发给客户端。

服务端代码示例二

#include <string>

#pragma execution_character_set("utf-8")  //设置字符串的格式为UTF-8

int main()
{
    std::string str = "测试";

    // ToDo,发送str给客户端
    //.....
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

本方法使用了#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格式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

总结:在不同平台之间传输中文数据的时候,一定要明确知道平台之间编码的差异(如vs2013的c++默认编码为GBK,而C#为Unicode),然后转成统一的编码进行网络传输(推荐utf8)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/253411
推荐阅读
相关标签
  

闽ICP备14008679号