Преобразование UTF-8 char * в CString - PullRequest
4 голосов
/ 15 апреля 2011

Как мне преобразовать строку в UTF-8 char * в CString?

Ответы [ 3 ]

4 голосов
/ 15 апреля 2011
bool Utf8ToCString( CString& cstr, const char* utf8Str )
{
    size_t utf8StrLen = strlen(utf8Str);

    if( utf8StrLen == 0 )
    {
        cstr.Empty();
        return true;
    }

    LPTSTR* ptr = cstr.GetBuffer(utf8StrLen+1);

#ifdef UNICODE
    // CString is UNICODE string so we decode
    int newLen = MultiByteToWideChar(
                     CP_UTF8,  0,
                     utf8Str, utf8StrLen,  ptr, utf8StrLen+1
                     );
    if( !newLen )
    {
        cstr.ReleaseBuffer(0);
        return false;
    }
#else
    WCHAR* buf = (WCHAR*)malloc(utf8StrLen);

    if( buf == NULL )
    {
        cstr.ReleaseBuffer(0);
        return false;
    }

    int newLen = MultiByteToWideChar(
                     CP_UTF8,  0,
                     utf8Str, utf8StrLen,  buf, utf8StrLen
                     );
    if( !newLen )
    {
        free(buf);
        cstr.ReleaseBuffer(0);
        return false;
    }

    assert( newLen < utf8StrLen );
    newLen = WideCharToMultiByte(
                     CP_ACP,  0,
                     buf, newLen,  ptr, utf8StrLen
                     );
    if( !newLen )
    {
        free(buf);
        cstr.ReleaseBuffer(0);
        return false;
    }

    free(buf);
#endif

    cstr.ReleaseBuffer(newLen);
    return true;
}

Хотя эта функция действительна как для конфигураций UNICODE, так и для конфигураций, отличных от UNICODE, IMHO использование конфигурации UNICODE в программах Win32 намного более продуктивно (в целом и в этой функции).

4 голосов
/ 15 апреля 2011

Звоните MultiByteToWideChar с кодовой страницей CP_UTF8, затем используйте CString как обычно.

0 голосов
/ 15 апреля 2011

Если ваша строка содержит только символы ASCII с кодами от 0 до 127, вы можете угрожать вашей строке UTF-8 как строке ASCII и инициализировать CString с ней:

CString my_cstr((char*)my_string);

В противном случае (если ваша строка UTF-8 содержит некоторые другие символы), у вас нет простого способа получить из нее строку char *.

...