用unicode文件名保存文件的问题-如何以跨平台的方式正确保存UTF-8文件名

C++ Saving file with unicode name problem - How to save UTF-8 filenames correctly in a crossplatform manner?

本文关键字:文件名 跨平台 方式正 确保 保存 UTF-8 保存文件 unicode 问题      更新时间:2023-10-16

我想保存一个文件名为Привет Мир.jpg的文件,我收到一个字符串(例如从文件中读取)(其中包含unicode),但我的c++代码将其保存为ÐÑÐ¸Ð²ÐµÑ ÐиÑ.jpg我怎样才能正确地保存它呢?(顺便说一句,如果我只是将该字符串保存到文件中,它会正确保存,这意味着只有我保存文件名的方式是错误的。如何修复这个?)

下面是我保存文件的代码:

void file_service::save_string_into_file( std::string contents, std::string name )
{
    std::string pathToUsers = this->root_path.string() + "/users/";
    boost::filesystem::path users_path ( this->root_path / "users/" );
    users_directory_path = users_path;
    general_util->create_directory(users_directory_path);
    std::ofstream datFile;
    name = users_directory_path.string() + name;
    datFile.open(name.c_str(), std::ofstream::binary | std::ofstream::trunc | std::ofstream::out    );
    datFile.write(contents.c_str(), contents.length());
    datFile.close();
}

,

void general_utils::create_directory( boost::filesystem::path path )
{
    if (boost::filesystem::exists( path ))
    {
        return;
    }
    else
    {
        boost::system::error_code returnedError;
        boost::filesystem::create_directories( path, returnedError );
        if ( returnedError )
        {
            throw std::runtime_error("problem creating directory");
        }
    }
}

更新:在帮助下,我现在有

void file_service::save_string_into_file( std::string contents, std::string s_name )
{
    boost::filesystem::path users_path ( this->root_path / "users" );
    users_directory_path = users_path;
    general_util->create_directory(users_directory_path);
    boost::filesystem::ofstream datFile;
    boost::filesystem::path name (users_directory_path / s_name);
    datFile.open(name, std::ofstream::binary | std::ofstream::trunc | std::ofstream::out    );
    datFile.write(contents.c_str(), contents.length());
    datFile.close();
}

但是当我保存文件时,它保存的文件名为Привет РњРёСЂ.jpg所以…我现在该怎么办呢?

c++标准库不支持Unicode。因此,您必须使用支持Unicode的库(如Boost.Filesystem)。

或者,您必须处理特定于平台的问题。Windows支持UTF-16,所以如果你有UTF-8字符串,你需要将它们转换为UTF-16 (std::wstring)。然后将它们作为文件名传递给iostream文件打开函数。Visual Studio版本的文件流可以使用wchar_t*作为文件名。