Как получить 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
Другие вопросы по тегам