C++向C#传输中文乱码解决方法

问题背景

项目中使用C++编写的lib文件作为客户端,通过Windows系统提供的远程连接API向C#编写的远端传输文本信息,客户端和远端系统语言均为中文。

 

触发乱码的场景

当文本信息均为英文时,并没有异常,C#端可以顺利收到发送的信息并写入文件,但是当C++端的发送文本中含有中文字符时,会在C#端接收到符号乱码。

 

问题原因和解决方法

通过添加输出(lib文件不便于实时调试,所以使用日志输出可疑变量代替打断点)发现两处产生乱码的地方:

  1. 从文件中读取到buffer中,产生一次正常中文到中文乱码(这时候还不是符号乱码)的错误。
  2. 从C++的buffer通过通道作用的API发送到C#端时,在C#端收到了符号乱码(即中文乱码变成符号乱码)。

网上查阅读取中文文本和跨语言传输中文的资料发现:

  1. 生成的txt,json等文件默认编码格式是UTF-8,而C++(我使用的是VS2019)的中文编码为ANSI,也有人称为GB,从UTF-8到ANSI过程中产生了乱码。
  2. 对于第1点,也可以通过 “另存为” 等方式手动修改txt等文件的编码格式,不多阐述。
  3. 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);

这样就实现了中文的传输。

函数代码来自论坛的其他大神,如有冒犯请私信联系。

 

posted @   北陌南旬  阅读(2251)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示