Как получить boost wdirectory_iterator для возврата UTF32 на Mac
directory_iterator возвращает UTF8, используя как Visual Studio, так и Xcode, как и ожидалось.
Однако wdirectory_iterator возвращает UTF16, используя Visual Studio, и UTF8, используя Xcode, несмотря на возвращение строки wchar_t.
Что я могу изменить, чтобы wdirectory_iterator возвращал UTF32?
Ответ на вопрос, который я задавал ранее, предполагает, что может потребоваться изменение локали, однако в соответствии с 'locale -a' доступны только локали:
en_GB, en_GB.ISO8859-1, en_GB.ISO8859-15, en_GB.US-ASCII, en_GB.UTF-8 Все они 8-битные, с возможным исключением en_GB
Я попробовал en_GB на случай, если он не будет 8-битным, но это заставляет boost::filesystem:: существующие генерировать исключение преобразования boost::filesystem::wpath::to_external.
1 ответ
wdirectory_iterator
является typedef для basic_directory_iterator<wpath>
, wpath
является typedef для basic_path<std::wstring, wpath_traits>
,
Аналогично тому, что делается в std::basic_filebuf
А basic_path
использует "внутреннюю" кодировку для представления имен программе и "внешнюю" кодировку для взаимодействия с файловой системой платформы. Преобразование между этими кодировками выполняется как в std::basic_filebuf
с помощью std::codecvt
локали пропитаны этим.
Итак, имена получены итератором из операционной системы в кодировке системы (это "внешняя" кодировка) и преобразованы во "внутреннюю" кодировку с помощью Traits::to_internal
, Чтобы выполнить желаемое преобразование, вы можете таким образом:
- Вызов
wpath_traits::imbue()
"рано" в вашей программе, передавая локаль с помощью фасета codecvt, выполняющего преобразование UTF8->UTF32 - Или определите и используйте свой собственный класс черт, где вы реализуете
to_internal
выполнить преобразование UTF8->UTF32