VC ++ Преобразование Юникода Традиционные китайские символы в многобайтовые не всегда работают - PullRequest
1 голос
/ 28 октября 2019

Мое приложение (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» не может быть, поэтому он был преобразован в «?».

Может кто-нибудь объяснить, почему и скажите, возможно ли преобразование правильно?

...