c++ Boost::filesystem::path包含unicode字符

C++ Boost::filesystem::path with unicode characters

本文关键字:unicode 字符 包含 filesystem Boost c++ path      更新时间:2023-10-16

我是c++新手,这里需要一点帮助。我有三个文件夹,一个是英文的,一个是日文的,还有一个是俄文的,用于测试。当我运行这个小程序

#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:/Testlol"
1
"D:/Testыюы"
2
"D:/Test???"
3
"D:/Testlol"
"D:/Testыюы"
"D:/Test???"
Process finished with exit code 0

这似乎不只是一个问题,因为当我试图做任何事情(如打开这些文件夹在资源管理器使用winapi)与向量项,只有英文命名的文件夹被程序代码识别。

我已经搜索了这个网站和谷歌的解决方案,他们都没有工作。尝试使用wcout wstring wchar_t等,但没有效果

在windows 8上使用mingw w64 4.0与gcc和clion/cmake。谢谢!

遗憾的是,unicode输出到windows控制台并不是一件容易的事。最可靠的方法是使用_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:w1>test
.CMakeFiles
1
.??????????????
2
.CMakeFiles
.??????????????

和conemu中CMD的下一个输出

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

所以在运行应用程序之前,你需要确保你可以看到目录名,例如dir