Мое приложение (MFC) является приложением Unicode, и у меня есть сторонняя DLL, которая принимает только многобайтовые символы, поэтому мне нужно преобразовать строку Unicode в многобайтовую строку, чтобы передать ее третьему лицуприложение. Корейские, японские и даже упрощенные китайские строки были преобразованы правильно, кроме традиционного китайского. Ниже описана моя попытка. Этот CPP кодируется в Unicode.
CString strFilePath(_T("中文字 深水埗.docx"));// (_T("中文字 深水埗.docx"));
wchar_t tcharPath[260];
wcscpy(tcharPath, (LPCTSTR)(strFilePath));
CString strAll = strFilePath;
int strAllLength = strAll.GetLength() + 1;
int nSize = 0;
char * pszBuf;
CPINFO pCPInfo;
BOOL bUsedDefaultChar = FALSE;
int nRC = GetCPInfo( CP_ACP, &pCPInfo );
if ((nSize = WideCharToMultiByte( CP_ACP, 0, strAll, strAllLength, NULL, 0, NULL, NULL )) > 0)
{ // Get the size of the buffer length
pszBuf = (char*)calloc(nSize + 1, sizeof(char)); // allocate the buffer
if (pszBuf == NULL)
return; // no more memory
nRC = WideCharToMultiByte( CP_ACP, 0, strAll, strAll.GetLength(), pszBuf, nSize+1, NULL, &bUsedDefaultChar ); // store Unicode chars to pszBuf
DWORD dwErr = GetLastError();
::MessageBoxA( NULL, pszBuf, "", MB_OK );
free(pszBuf); // free it.
}
В Windows для упрощенного китайского языка вышеуказанные 6 китайских символов отображались правильно. К сожалению, в Windows для традиционного китайского языка шестой символ «couldn't» не может быть, поэтому он был преобразован в «?».
Может кто-нибудь объяснить, почему и скажите, возможно ли преобразование правильно?