Illegal Bytes sequence

код:

std::string path_str = *i;
std::string folder = path_str + "\\test";
std::cout << folder << std::endl; //выдаёт полный путь, но когда русские символы начинаются, то выводит кряказяблики
std::filesystem::create_directory(std::filesystem::path(folder)); //ошибка здесь

нифига не работает, спасают только std::wstring, но конвертировать не знаю как. А решение этого у меня было - костыли: нужно просто загрузить std::string в текстовый файл, а потом выгрузить в std::wstring. После всего этого работает! Но как можно без костылей обойтись?

path_str - это полный путь, выводится, опять же говорил, с кряказябликами... А помогают костыли выше описанные...

выводится в консоль:

C:\Users\─ьшЄЁшщ\Desktop\Ckuz\test
terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
  what():  filesystem error: Cannot convert character sequence: Illegal byte sequence

Ответы (1 шт):

Автор решения: HolyBlackCat

Чтобы нормально работали UTF-8 пути (без использования неудобного char8_t), нужно выставить локаль с UTF-8:

std::setlocale(LC_ALL, ".UTF-8");

Чтобы ввод/вывод в консоли был в UTF-8, так:

SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);

Все вместе получается так:

#include <clocale>
#include <iostream>
#include <filesystem>

#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX 1
#include <windows.h> // Для SetConsole...
#endif

int main()
{
    #ifdef _WIN32
    std::setlocale(LC_ALL, ".UTF-8");
    SetConsoleCP(CP_UTF8);
    SetConsoleOutputCP(CP_UTF8);
    #endif
    
    std::filesystem::path p("Привет");
    std::filesystem::create_directory(p);
    std::cout << p.string() << '\n';
}

Ну и я предполагаю, что у вас все строки в UTF-8. Если нет - переделайте в UTF-8.

→ Ссылка