1

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

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;    
} 

-----------------------------------------------------
4

1 回答 1

0

呃,没有 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不会更改,因为字符串已正确转换回来。

于 2012-08-18T11:10:02.573 回答