Как получить 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::exists выдает исключение преобразования boost::filesystem::wpath::to_external.


person David Sykes    schedule 29.10.2009    source источник
comment
Но я получаю обратно UTF-8, а не 16 или 32, и все ссылки, которые я нашел, указывают, что Mac wchar_t - это UTF-32. Возможно, мне придется конвертировать из UTF-8, но я хотел бы убедиться, что сначала не упустил что-то более стандартное.   -  person David Sykes    schedule 29.10.2009
comment
Извини, Давид, я ошибся. На Mac собственная кодировка для wchar_t зависит от комбинации порядка следования байтов и размера wchar_t.   -  person dirkgently    schedule 29.10.2009
comment
Попробуйте boost.org/doc/libs/1_40_0/libs /сериализация/doc/codecvt.html   -  person dirkgently    schedule 29.10.2009


Ответы (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.
  • Или определите и используйте свой собственный класс Traits, где вы реализуете to_internal для выполнения преобразования UTF8-> UTF32.
person Éric Malenfant    schedule 29.10.2009