C++ Boost::filesystem::path 带有 unicode 字符
C++ Boost::filesystem::path with unicode characters
我是 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:/Test\lol"
1
"D:/Test\ыюы"
2
"D:/Test\???"
3
"D:/Test\lol"
"D:/Test\ыюы"
"D:/Test\???"
Process finished with exit code 0
这似乎不仅仅是 cout 问题,因为当我尝试对向量项执行任何操作(比如使用 winapi 在资源管理器中打开这些文件夹)时,程序代码只能识别英文命名的文件夹。
我已经搜索了这个网站并 google 寻找解决方案,但都没有用。尝试使用 wcout wstring wchar_t 等没有任何效果。
在 windows 8 上使用带有 gcc 和 clion/cmake 的 mingw w64 4.0。
谢谢!
不幸的是,将 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:\w>test
.\CMakeFiles
1
.\??????????????
2
.\CMakeFiles
.\??????????????
cmd 中的下一个输出 conemu
C:\w>test
.\CMakeFiles
1
.\اختبارテスト試験Про
2
.\CMakeFiles
.\اختبارテスト試験Про
因此,在 运行 您的应用之前,您需要确保您可以看到带有 dir
的目录名称。
我是 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:/Test\lol"
1
"D:/Test\ыюы"
2
"D:/Test\???"
3
"D:/Test\lol"
"D:/Test\ыюы"
"D:/Test\???"
Process finished with exit code 0
这似乎不仅仅是 cout 问题,因为当我尝试对向量项执行任何操作(比如使用 winapi 在资源管理器中打开这些文件夹)时,程序代码只能识别英文命名的文件夹。
我已经搜索了这个网站并 google 寻找解决方案,但都没有用。尝试使用 wcout wstring wchar_t 等没有任何效果。
在 windows 8 上使用带有 gcc 和 clion/cmake 的 mingw w64 4.0。 谢谢!
不幸的是,将 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:\w>test
.\CMakeFiles
1
.\??????????????
2
.\CMakeFiles
.\??????????????
cmd 中的下一个输出 conemu
C:\w>test
.\CMakeFiles
1
.\اختبارテスト試験Про
2
.\CMakeFiles
.\اختبارテスト試験Про
因此,在 运行 您的应用之前,您需要确保您可以看到带有 dir
的目录名称。