下面的程序在Visual Studio 2008編譯Windows下下,都與字符集 「使用Unicode字符集」和「使用多字節字符集」。但是,它不能在Ubuntu 10.04.2 LTS 64位和GCC 4.4.3下編譯。我在兩種環境下都使用Boost 1.46.1。的boost ::文件系統和Unicode Linux和Windows
#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 ::路徑::本地()」
它看起來對我來說,升壓:: Linux下的文件系統不提供路徑)寬字符的字符串::本地(儘管已用初始化的boost ::文件系統::路徑寬字符串。此外,我猜測這是因爲Linux默認爲UTF-8,Windows默認爲UTF-16。
所以我的第一個問題是,我怎麼寫這兩個平臺上使用的boost ::文件系統,並支持Unicode路徑的程序?
第二個問題:當我在Windows下運行此程序,它輸出:
/test/test2
我的理解是,本地()方法應該將路徑轉換到Windows下的原生格式,這是使用反斜槓代替正斜槓。爲什麼字符串以POSIX格式出現?
謝謝您的回答。再看看這一點,看起來使用cout而不是寬字符是Linux中的一種方式,因爲在那裏所有的東西都是UTF-8。但在Windows控制檯中,使用wcout雖然會編譯,但不能正確顯示Unicode字符。爲了實現這一目標,顯然有幾個環節必須跳過。 – 2011-03-17 05:40:31
Windows控制檯能夠以UTF-16格式顯示Unicode,但其默認字體不可用,必須將控制檯設置更改爲Unicode字體。同樣根據我的經驗,即使您通過UTF-16並且輸出爲UTF-16,通過Windows的C I/O函數的所有路由也會愚蠢地通過非Unicode的8位編碼瓶頸!您可能能夠做一些設置並傳遞一些參數以避免它......但調用「寬」Windows控制檯輸出API要容易得多。 – hippietrail 2012-08-13 08:31:52