C++向C#传输中文乱码解决方法
问题背景
项目中使用C++编写的lib文件作为客户端,通过Windows系统提供的远程连接API向C#编写的远端传输文本信息,客户端和远端系统语言均为中文。
触发乱码的场景
当文本信息均为英文时,并没有异常,C#端可以顺利收到发送的信息并写入文件,但是当C++端的发送文本中含有中文字符时,会在C#端接收到符号乱码。
问题原因和解决方法
通过添加输出(lib文件不便于实时调试,所以使用日志输出可疑变量代替打断点)发现两处产生乱码的地方:
- 从文件中读取到buffer中,产生一次正常中文到中文乱码(这时候还不是符号乱码)的错误。
- 从C++的buffer通过通道作用的API发送到C#端时,在C#端收到了符号乱码(即中文乱码变成符号乱码)。
网上查阅读取中文文本和跨语言传输中文的资料发现:
- 生成的txt,json等文件默认编码格式是UTF-8,而C++(我使用的是VS2019)的中文编码为ANSI,也有人称为GB,从UTF-8到ANSI过程中产生了乱码。
- 对于第1点,也可以通过 “另存为” 等方式手动修改txt等文件的编码格式,不多阐述。
- C++的中文编码为ANSI,C#的编码格式为UTF-8,同样产生编码错误,所以传输过程中 C++需要先从ANSI转为Unicode格式发送给C#,C#把Unicode转为UTF-8,这样解决编码错误。
C++从UTF-8文件中读取中文后,正确的转化中文方式:
string UTF8ToANSI(const char* str) //str is the UTF-8 input { string result; WCHAR* strSrc; LPSTR szRes; //get tempvalue size , then copy UTF-8 str to strSrc int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); strSrc = new WCHAR[i + 1]; MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i); //get tempvalue size, then copy UTF-8 strSrc to ANSI szRes i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL); szRes = new CHAR[i + 1]; WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL); result = szRes; delete[]strSrc; delete[]szRes; return result; }
ANSI编码转为Unicode编码,以供发送给C#:
bool ANSIToUnicode(CString cstr, string& str) { int i = 0; int strlen = 0; int hexlen = 0; long hexlong = 0; strlen = cstr.GetLength(); if (strlen <= 0) { return false; } wchar_t* wchs = new wchar_t[strlen + 1]; memset(wchs, 0, sizeof(wchar_t) * (strlen + 1)); wcscpy_s(wchs, strlen + 1, cstr.GetBuffer(strlen)); hexlen = strlen * 7; char* hexstr = new char[hexlen + 1]; memset(hexstr, 0, hexlen + 1); char tchar[7]; wchar_t* szHex = wchs; for (i = 0; i < strlen; i++) { hexlong = (long)(*szHex++); sprintf_s(tchar, "\\u%04x", hexlong); strcat_s(hexstr, hexlen, tchar); } str = (string)hexstr; if (wchs) { delete[] wchs; } if (hexstr) { delete[] hexstr; } return true; }
在C#端,接收到Unicode编码文本后还原为UTF-8编码的方式:
clientJsonStr=Regex.Unescape(clientJsonStr);
这样就实现了中文的传输。
函数代码来自论坛的其他大神,如有冒犯请私信联系。
荡尘涤污,重整河山,便在今日
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人