c++ - 我该如何修复此代码?

标签 c++ visual-studio-2010 mfc dialog web

这段代码没有按预期工作,我不知道哪里出了问题。

szTeam 应该改变,但没有改变。

谁能解释一下?

-----------------------------------------------------

WCHAR   szTeam[MAX_PATH] = L"\u7F57\u5207\u8FBE\u5C14\u6D41\u6D6A";
char    szMsg[MAX_PATH];

sprintf(szMsg , "%s"  , WideStringToMultiByte(szTeam));
swprintf( szTeam , L"%s" , MultiByteToWideString(szMsg));

......

WCHAR* MultiByteToWideString(const char* szSrc)
{
    int iSizeOfStr = MultiByteToWideChar(CP_ACP, 0, szSrc, -1, NULL, 0);  
    wchar_t* wszTgt = new wchar_t[iSizeOfStr];  
    if(!wszTgt)
        return (NULL);  
    MultiByteToWideChar(CP_ACP, 0, szSrc, -1, wszTgt, iSizeOfStr);
    return(wszTgt);
}

char* WideStringToMultiByte(const wchar_t* wszSrc)  
{  
    int iSizeOfStr = WideCharToMultiByte(CP_UTF8, 0, wszSrc, -1, NULL, 0, NULL, NULL);  
    char* szTgt = new char[iSizeOfStr];  
    if(!szTgt)
        return(NULL);  
    WideCharToMultiByte(CP_UTF8, 0, wszSrc, -1, szTgt, iSizeOfStr, NULL, NULL);  
    return szTgt;    
} 

-----------------------------------------------------

最佳答案

嗯,szTeam 没有改变。变成无法辨认的东西,mojibake。您从“罗切达尔流浪”开始并将其从 utf-16 编码转换为 utf-8。那很好用。调试器不会向您显示任何可识别的内容,因为它既不知道也不关心 szMsg 是以 utf-8 编码的。

然后你就出错了,你正在用 CP_ACP 转换那个 utf-8 字符串。这表示该字符串是在默认系统代码页中编码的。不是,它是用 utf-8 编码的。

解决您的问题:

WCHAR* MultiByteToWideString(const char* szSrc)
{
    int iSizeOfStr = MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, NULL, 0);  
    // etc..
}

现在 szTeam 不会改变,因为字符串已正确转换回来。

关于c++ - 我该如何修复此代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12017173/

相关文章:

c++ - 如何防止 MFC 对话框在 Enter 和 Escape 键上关闭?

c# - WCF 服务。如何返回 HTTP 500 响应

c++ - 如何将 LPTSTR 转换为 LPCWSTR?

c++ - 如何将项目添加到 MFC 对话框中的列表控件

c++ - 如何在特定窗口中设置控件的初始焦点?

C++ 带有派生类的模板专门化

c++ - 直接访问硬盘

c++ - 使用较旧版本的 MFC 和较新版本的 Visual Studio

c++ - 图形在空间中的方向

visual-studio-2010 - 对 ASP.Net MVC 4 应用程序进行彻底的单元测试