2015-06-02 97 views
1

我是C++新手,需要一點幫助。我有三個文件夾 - 一個用英文,一個用日文,一個用俄語出於測試目的。當我跑這個小程序C++ Boost :: filesystem ::具有unicode字符的路徑

#include <windows.h> 
#include <string> 
#include <iostream> 
#include <boost/filesystem.hpp> 
#include <boost/locale.hpp> 

using namespace boost::filesystem; 
using namespace std; 

void iterateDirs(const path &dir_path, vector<path> &dir) 
{ 
    if (exists(dir_path)) 
    { 
     directory_iterator end_itr; 
     for (directory_iterator itr(dir_path); itr != end_itr; ++itr) { 
      if (is_directory(itr->status())) { 
       cout << *itr << endl; 
       dir.push_back(itr->path()); 
       cout << dir.size() << endl; 
      } 
     } 
    } 
} 

int main() { 
    vector<path> dirs; 

    iterateDirs("D:/Test", dirs); 
    for (path p : dirs) { 
     cout << p << endl; 
    } 
    return 0; 
} 

只有英文字母被識別。 這是輸出的外觀

D:/Test\lol" 
1 
"D:/Test\ыюы" 
2 
"D:/Test\???" 
3 
"D:/Test\lol" 
"D:/Test\ыюы" 
"D:/Test\???" 

Process finished with exit code 0 

它似乎只喜歡COUT的問題,因爲當我試圖做任何事情(像打開資源管理器使用WINAPI這些文件夾)與載體的項目,只有英文名稱的文件夾是由程序代碼識別。

我已經搜索了這個網站和谷歌的解決方案,他們都沒有工作。嘗試使用wcout wstring wchar_t等沒有用。

使用mingw w64 4.0與gcc和clion/cmake在Windows 8上。 謝謝!

回答

1

不幸的是輸出到windows控制檯的unicode並不是一件容易的事情。最可靠的方法是使用_cputws或WriteConsoleW,但這些函數直接寫入控制檯,而流重定向不適用於它們。這個程序:

#include <windows.h> 
#include <string> 
#include <iostream> 
#include <boost/filesystem.hpp> 
#include <boost/locale.hpp> 

using namespace boost::filesystem; 
using namespace std; 

void iterateDirs(const path &dir_path, vector<path> &dir) 
{ 
    if (exists(dir_path)) 
    { 
     directory_iterator end_itr; 
     for (directory_iterator itr(dir_path); itr != end_itr; ++itr) { 
      if (is_directory(itr->status())) { 
       _cputws(itr->path().wstring().c_str()); 
       _cputws(L"\n"); 
       dir.push_back(itr->path()); 
       cout << dir.size() << endl; 
      } 
     } 
    } 
} 

int main() { 
    vector<path> dirs; 

    iterateDirs(".", dirs); 
    for (path p : dirs) { 
     _cputws(p.wstring().c_str()); 
     _cputws(L"\n"); 
    } 
    return 0; 
} 

產生在CMD下一個輸出與點陣字體:

C:\w\1>test 
.\CMakeFiles 
1 
.\?????????????? 
2 
.\CMakeFiles 
.\?????????????? 

,並在CMD下一個輸出中conemu

C:\w\1>test 
.\CMakeFiles 
1 
.\اختبارテスト試験Про 
2 
.\CMakeFiles 
.\اختبارテスト試験Про 

所以運行你的應用程序之前,你需要確保你可以看到目錄名稱,例如dir

相關問題