如何在 CPP 的给定目录中列出 UTF 编码的文件名?

How to list UTF encoded filenames in a given directory in CPP?

我正在尝试获取给定目录中的所有文件,在 Windows 10 下,使用基于 CMake 的 CPP 项目(VS 编译器)。 我不能使用 boost 或其他库。 我正在使用以下功能

        string search_path = "D:\*.*";
        WIN32_FIND_DATA fd;
        HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd);
        if(hFind != INVALID_HANDLE_VALUE)
        {
            do {
                // read all (real) files in current folder
                // , delete '!' read other 2 default folder . and ..
                if(! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
                {
                    printf("%s - ", fd.cFileName);
                    
                    for (int i = 0; i < 30; ++i)
                    {
                        printf("%02x", fd.cFileName[i]);
                    }
                    printf("\n");
                }
            } while(::FindNextFile(hFind, &fd));
            ::FindClose(hFind);
        }

它适用于 ASCII 文件名,但阿拉伯文文件显示为

???? ???? ?????.jpg - 3f3f3f3f203f3f3f3f203f3f3f3f3f2e6a706700746d6c0000696e646f77

欢迎任何指点。

问题出在您系统上的编码设置上。 要使其正常工作,您的系统必须配置为以单字节编码处理阿拉伯字符。 Windows 不要使用 UTF-8。 检查 code page.

其他方法是使用宽字符 API 和 wchar_t。在这种情况下 Windows 使用 UCS-2UTF-16 并且它应该开箱即用。

还有must read.

如果您有,您也可以尝试使用标准库解决方案

for(auto& p: std::filesystem::directory_iterator("D:\")) {
  std::wstring file_name = p.wstring();
}