Linux和Windows下的boost :: filesystem和Unicode

Rog*_*ahl 9 linux windows filesystems unicode boost

以下程序在Windows下的Visual Studio 2008中编译,包括字符集"使用Unicode字符集"和"使用多字节字符集".但是,它不能在Ubuntu 10.04.2 LTS 64位和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;
}
Run Code Online (Sandbox Code Playgroud)

Linux下的编译错误是:

test.cpp:6:错误:'std :: wcout << p.boost :: filesystem3 :: path :: native()'中'operator <<'不匹配

在我看来,Linux下的boost :: filesystem在path :: native()中没有提供宽字符串,尽管boost :: filesystem :: path已经用宽字符串初始化了.此外,我猜这是因为Linux默认为UTF-8,Windows默认为UTF-16.

所以我的第一个问题是,如何在两个平台上编写一个使用boost :: filesystem并支持Unicode路径的程序?

第二个问题:当我在Windows下运行该程序时,它输出:

/test/test2
Run Code Online (Sandbox Code Playgroud)

我的理解是native()方法应该在Windows下将路径转换为本机格式,它使用反斜杠而不是正斜杠.为什么字符串以POSIX格式出现?

fil*_*mor 2

您的理解native并不完全正确:

本机路径名格式: 实现定义的格式。[注意:对于类 POSIX 操作系统,本机格式与通用格式相同。对于 Windows,本机格式与通用格式类似,但目录分隔符可以是斜杠或反斜杠。--注释结束]

来自参考

这是因为 Windows 允许 POSIX 样式的路径名,因此使用native()不会导致上述问题。

因为您的输出可能经常遇到类似的问题,我认为最好的方法是使用预处理器,即:

#ifdef WINDOWS
std::wostream& console = std::wcout;
#elif POSIX
std::ostream& console = std::cout;
#endif
Run Code Online (Sandbox Code Playgroud)

字符串类也有类似的东西。