boost :: filesystem и Unicode под Linux и Windows - PullRequest
9 голосов
/ 15 марта 2011

Следующая программа компилируется в Visual Studio 2008 под Windows с обоими наборами символов «Использовать набор символов Unicode» и «Использовать многобайтовый набор символов».Тем не менее, он не компилируется под Ubuntu 10.04.2 LTS 64-bit и GCC 4.4.3.Я использую Boost 1.46.1 в обеих средах.

#include <boost/filesystem/path.hpp>
#include <iostream>

int main() {
  boost::filesystem::path p(L"/test/test2");
  std::wcout << p.native() << std::endl;
  return 0;
}

Ошибка компиляции в Linux:

test.cpp: 6: ошибка: нет совпадения с оператором << в instd :: wcout << p.boost :: filesystem3 :: path :: native () '</p>

Мне кажется, что boost :: filesystem под Linux не предоставляет строку широких символов в path :: native(), несмотря на то, что boost :: filesystem :: path инициализирован широкой строкой.Кроме того, я предполагаю, что это потому, что Linux по умолчанию использует UTF-8, а Windows - UTF-16.пути на обеих платформах?

Второй вопрос: Когда я запускаю эту программу под Windows, она выдает:

/test/test2

Насколько я понимаю, метод native () должен преобразовывать путь в нативныйформат под Windows, который использует обратную косую черту вместо прямой.Почему строка выходит в формате POSIX?

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Ваше понимание native не совсем правильно:

Формат собственного пути: Формат, определенный реализацией.[Примечание: для POSIX-подобных операционных систем собственный формат совпадает с общим форматом.Для Windows собственный формат аналогичен общему формату, но символы разделителя каталогов могут быть как косыми, так и обратными.- end note]

из Ссылка

Это связано с тем, что Windows допускает имена путей в стиле POSIX, поэтому использование native() не вызовет проблем с приведенным выше.

Поскольку у вас часто могут возникать похожие проблемы с выходными данными, я думаю, что лучшим способом было бы использовать ваш препроцессор, например:

#ifdef WINDOWS
std::wostream& console = std::wcout;
#elif POSIX
std::ostream& console = std::cout;
#endif

и что-то подобное для класса строк.

1 голос
/ 15 марта 2011

Если вы хотите использовать широкие выходные потоки, вы должны преобразовать в широкую строку:

#include <boost/filesystem/path.hpp>
#include <iostream>

int main() {
  boost::filesystem::path p(L"/test/test2");
  std::wcout << p.wstring() << std::endl;
  return 0;
}

Обратите внимание, что AFAIK с использованием wcout не дает вывод Unicode в Windows;вам нужно использовать wprintf вместо.

0 голосов
/ 13 августа 2012

Попробуйте это:

#include <boost/filesystem/path.hpp>
#include <iostream>

int main() {
  boost::filesystem::path p("/test/test2");
  std::wcout << p.normalize() << std::endl;
  return 0;
}
...