这段代码没有按预期工作,我不知道哪里出了问题。
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/