У меня Windows, и я создаю std::filesystem::path
из std::string
. Согласно ссылке на конструктор (акцент мой):
Если тип исходного символа —
char
, предполагается, что исходная кодировка является собственной узкой кодировкой (поэтому преобразование в системах POSIX не выполняется).
Если я правильно понимаю, это означает, что строковое содержимое будет рассматриваться как закодированное в ANSI под Windows. Чтобы обработать его как закодированный в UTF-8, мне нужно использовать функцию std::filesystem::u8path()
. См. демонстрацию: http://rextester.com/PXRH65151
Я хочу, чтобы конструктор path
обрабатывал содержимое узкой строки в кодировке UTF-8. Для boost::filesystem::path
я мог бы использовать метод imbue()
для этого:
boost::filesystem::path::imbue(std::locale(std::locale(), new std::codecvt_utf8_utf16<wchar_t>()));
Однако я не вижу такого метода в std::filesystem::path
. Есть ли способ добиться такого поведения для std::filesystem::path
? Или мне нужно плевать u8path
во все стороны?
u16string
илиwstring
для компиляторов до C++11, если они остались - person Panagiotis Kanavos   schedule 13.03.2017UNICODE
во всех наших решениях. Что вы подразумеваете под использованием ANSI? Как я использую это мое демо? - person Mikhail   schedule 13.03.2017native narrow encoding
означает кодовую страницу ASCII, используемую локалью системы, которая отображается вRegional Settings
какLanguage for non-Unicode programs
. - person Panagiotis Kanavos   schedule 13.03.2017string
иchar
— однобайтовые типы. Типы Unicode являются многобайтовыми. Символы UTF16 — этоchar16_t
и эквивалентные строкиu16string
. До C++11UNICODE
означало, чтоwchar
использовалось везде, где появлялся макрос_TCHAR
. Явно используяchar
иstring
, вы используете однобайтовые (ASCII/ANSII) типы. - person Panagiotis Kanavos   schedule 13.03.2017u8path
, когда вам нужно создать путь из строки UTF-8? - person Nicol Bolas   schedule 13.03.2017filesystem
в том, что нам не нужно делать подобное кодирование для конкретной платформы. Если вы хотите использовать UTF-8 везде (и должны), вы можете это сделать. - person Nicol Bolas   schedule 13.03.2017path
всех, как сейчас. Итак, пока вы это делаете, почему бы не использоватьu8path
при создании путей из строк UTF-8? - person Nicol Bolas   schedule 13.03.2017fs::path
везде, и мы хотели просто изменитьfs
сboost::filesystem
наstd::filesystem
на заре C++17. - person Mikhail   schedule 13.03.2017