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格式出现?
您的理解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)
字符串类也有类似的东西。
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |