Невозможно преобразовать массив символов в строку wstf-8 - PullRequest
0 голосов
/ 14 сентября 2018

Когда я пытался преобразовать char * в wstring, используя нижеприведенную функцию в Visual C ++. Функция способна преобразовывать строки на обычном английском языке, но когда я использую символы из другого языка, она не преобразует все символы.

std::wstring s2ws(const char* utf8Bytes)
{
    const std::string& str(utf8Bytes);
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

Пример: Когда я печатаю преобразованное значение в MessageBox, Grüßen отображается как Gr ?? en

Я использую эту преобразованную строку wstring для получения содержимого моего каталога, как показано ниже:

map<wstring, wstring> getAllFiles(wstring folder, wstring filter) {  
    wstring directory = folder + L"/" + filter;
    WCHAR szBuf[MAX_PATH];
    WIN32_FIND_DATA d;
    HANDLE hFindFile = FindFirstFile(directory.c_str(), &d);
    .....
}

Здесь я не получаю ожидаемый результат. то есть содержимое каталога. Но получается, когда массив utf8bytes содержит нормальные английские символы.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я думаю, что ваш код работает правильно, и проблема должна быть в вашей строке UTF-8.Если я назову ваш код следующим образом, он будет работать как положено:

char utf8buffer[1024];

WideCharToMultiByte(
    CP_UTF8,
    WC_ERR_INVALID_CHARS,
    L"Grüßen",
    -1,
    utf8buffer,
    1024,
    nullptr,
    false
);

assert(s2ws(utf8buffer) == L"Grüßen");
0 голосов
/ 14 сентября 2018

Я думаю, вам следует изменить код ниже:

std::wstring s2ws(const char* utf8Bytes)
{
    const std::string& str(utf8Bytes);
    int size_needed = MultiByteToWideChar(CP_ACP, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_ACP, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

Разница между двумя флагами указана здесь .

...