以下程序在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&lt;&lt;'中的'operator&lt;&lt;'不匹配p.boost :: filesystem3 ::路径::天然()”
在我看来,Linux下的boost :: filesystem在path :: native()中没有提供宽字符串,尽管boost :: filesystem :: path已经用宽字符串初始化了。此外,我猜这是因为Linux默认为UTF-8,Windows默认为UTF-16。
所以我的第一个问题是,如何在两个平台上编写一个使用boost :: filesystem并支持Unicode路径的程序?
第二个问题:当我在Windows下运行该程序时,它会输出:
/test/test2
我的理解是native()方法应该在Windows下将路径转换为本机格式,它使用反斜杠而不是正斜杠。为什么字符串以POSIX格式出现?
答案 0 :(得分:2)
您对native
的理解并不完全正确:
本机路径名格式:实现定义的格式。 [注意:对于类似POSIX的操作系统,本机格式与通用格式相同。对于Windows,本机格式类似于通用格式,但目录分隔符可以是斜杠或反斜杠。 - 后注]
这是因为Windows允许使用POSIX风格的路径名,因此使用native()
不会导致上述问题。
因为您的输出可能经常遇到类似的问题,我认为最好的方法是使用您的预处理器,即:
#ifdef WINDOWS
std::wostream& console = std::wcout;
#elif POSIX
std::ostream& console = std::cout;
#endif
和字符串类似的东西。
答案 1 :(得分:1)
如果要使用宽输出流,则必须转换为宽字符串:
#include <boost/filesystem/path.hpp>
#include <iostream>
int main() {
boost::filesystem::path p(L"/test/test2");
std::wcout << p.wstring() << std::endl;
return 0;
}
请注意,使用wcout
的AFAIK不会在Windows上提供Unicode输出;您需要改为使用wprintf
。
答案 2 :(得分:0)
试试这个:
#include <boost/filesystem/path.hpp>
#include <iostream>
int main() {
boost::filesystem::path p("/test/test2");
std::wcout << p.normalize() << std::endl;
return 0;
}