C++ 保存带有 unicode 名称问题的文件 - 如何以跨平台方式正确保存 UTF-8 文件名?

标签 c++ file boost unicode save

我想保存一个名为 Привет Мир.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");
        }
    }
}

更新:with help我现在有

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* 作为文件名。

关于C++ 保存带有 unicode 名称问题的文件 - 如何以跨平台方式正确保存 UTF-8 文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975267/

相关文章:

c++ - 是否有用于 C++ 项目的类似 ReSharper 的工具?

java - 转义序列无效(有效的是\b\t\n\f\r\"\'\\)

java - 如何在 Android 中引用原始文件夹中的文件

具有自定义键的 C++ unordered_map 导致空值

c++ - 使用 boost :thread 的可运行类

c++ - Unordered_map 使用 2D 点进行查找

c++ - 折叠复制和 move 语义的重载

c++ - 如何渲染彩虹光谱?

c - 当strtok返回NULL时如何继续从文件中读取

c++ - boost 范围适配器变平