Как получить boost wdirectory_iterator для возврата UTF32 на Mac - PullRequest
0 голосов
/ 29 октября 2009

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 Ответ

1 голос
/ 29 октября 2009

wdirectory_iterator является typedef для basic_directory_iterator<wpath>. wpath - это typedef для basic_path<std::wstring, wpath_traits>.

Аналогично тому, что делается в std::basic_filebuf, A basic_path использует «внутреннюю» кодировку для представления имен программе и «внешнюю» кодировку для взаимодействия с файловой системой платформы. Преобразование между этими кодировками выполняется, как в std::basic_filebuf, с использованием std::codecvt локали, вставленной в него.

Итак, имена получены итератором из операционной системы в системной кодировке (это «внешняя» кодировка) и преобразованы во «внутреннюю» кодировку с помощью Traits::to_internal. Чтобы выполнить желаемое преобразование, вы можете таким образом:

  • Вызовите wpath_traits::imbue() "рано" в вашей программе, передав ей локаль с фасетом codecvt, выполняющего преобразование UTF8-> UTF32
  • Или определите и используйте свой собственный класс черт, в котором вы реализуете to_internal для выполнения преобразования UTF8-> UTF32
...