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.