Как конвертировать путь в wstring?

Мне нужно, чтобы путь конвертировался в std::wstring, чтобы в дальнейшем мне работать с ним. Чтобы символы, всё кодировалось правильно, даже ASCII символы. Вот зачем мне нужно конвертирование.

Чтобы вызывать программу, я пишу:

"C:\Users\Дмитрий ПК\Desktop\project\testing2.exe"

когда я вызываю, то мне пишет вот такую ошибку:

terminate called after throwing an instance of 'std::range_error'
  what():  wstring_convert::from_bytes

вот код:

#include <iostream>
#include <locale>
#include <codecvt>

int main(int argc, char** argv) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    
    std::wstring wstr = converter.from_bytes(argv[0]);
    
    std::wcout << wstr << std::endl;
    
    return 0;
}

я использую: компилятор g++, windows 11, visual studio(в качестве текстового редактора, но не компилятора)


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

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

Не уверен в какой кодировке argv, но явно не в UTF-8.

Если это все равно аргументы командной строки, можно не возиться с преобразованием и сразу взять готовые широкие строки из __wargv (нестандартная фича винды; вне винды wchar_t все равно никому не нужен).

#include <cstdlib> // __argc, __wargv
#include <iostream>

int main()
{
    for (int i = 0; i < __argc; i++)
        std::wcout << i << " [" << __wargv[i] << "]\n";
}

Просто для общего развития: std::wstring_convert и std::codecvt_utf8 объявлены deprecated (т.е. устаревшими) в C++17, последний удален из языка в C++26.

Лучше так:

std::filesystem::path p = std::filesystem::u8path(строка);

Дальше p.c_str() выдает wchar_t *, а p.native() выдает const std::wstring & (опять же, это все только на винде; на остальных ОС filesystem::path состоит из char).

u8path - тоже deprecated, но это спорный момент и глупость. (Остается только конструктор принимающий const char8_t *, но в него никак не передать const char * без копирования.)

Поэтому мое мнение - u8path лучше всего, и обложить pragma-ми заглущающими варнинг о deprecation.

→ Ссылка