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
- C++与C#网络传输中的编码转换
- 关于网络传输中的编码
- android网络传输中的大小端转换
- android网络传输中的大小端转换
- C#中的String编码转换
- C# 中的编码转换实现
- Base64编码在网络图片传输中的应用实例
- c#开发中的编码转换问题
- C#中的字符串及其编码转换
- C# 网络异步传输
- C运行库中的字符编码转换
- C#调用C++DLL时的编码转换-编码、字符集
- 网络传输中文编码问题
- 网络传输中的string
- Python中的编码与格式转换
- C语言编码与字符转换
- HDMI 转换与传输
- C#中的命名规则与编码规范
- UITextView的一些知识
- GeoHash核心原理解析
- C# 简单时间操作
- 一个在unity3d中使用Excel做配置的解决方案
- Android 权限大全
- C++与C#网络传输中的编码转换
- USACO-Section 1.5 Number Triangles(DP)
- android 学习笔记 服务的基本用法
- iOS手势
- SpringBoot自定义参数注解
- UIImageView多张图片切换
- Maven pom.xml 配置详解
- HTTP Basic Authorization(附iOS实现方法)
- C# datagridview 赋值方式