boost :: filesystem和Unicode在Linux和Windows下

以下程序在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; } 

Linux下的编译错误是:

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

它看起来像我在Linux下boost :: filesystem不提供宽的string在path::本地(),尽pipeboost :: filesystem ::path已被初始化为一个宽string。 此外,我猜这是因为Linux默认为UTF-8和Windows到UTF-16。

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

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

 /test/test2 

我的理解是native()方法应该将path转换为Windows下的本地格式,这是使用反斜杠而不是正斜杠。 为什么string以POSIX格式出现?

Solutions Collecting From Web of "boost :: filesystem和Unicode在Linux和Windows下"

你对native理解并不完全正确:

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

从参考

这是因为Windows允许POSIX风格的路径名,所以使用native()不会导致上述问题。

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

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

和类字符串类似的东西。

如果你想使用宽输出流,你必须转换成一个宽字符串:

 #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不会给你在Windows上的Unicode输出; 你需要使用wprintf来代替。

尝试这个:

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