Как конвертировать путь в 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 шт):
Не уверен в какой кодировке 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.