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

发布于 2024-11-28 11:57:12 字数 109 浏览 1 评论 0原文

我想保存一个名为 Привет Мир.jpg 的文件 我收到一个字符串(例如从文件中读取)(其中包含 unicode),但我的 C++ 代码将其保存为 ÐÑивеÑ

I want to save a file with name Привет Мир.jpg I receive a string (read it from file for example) (with unicode in it) but my C++ code saves it as ÐÑÐ¸Ð²ÐµÑ ÐиÑ.jpg
What shall I do to save it correctly? (btw if I just save that string into file it saves correctly, meaning only the way I save filename is some whay wrong. How to fix this?)

Here is my code for file saving:

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();
}

where

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");
        }
    }
}

Update: with help I now have

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();
}

But when I save file it saves its file name as Привет Мир.jpg so.. What shall I do now?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

栀子花开つ 2024-12-05 11:57:12

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

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

The C++ standard library is not Unicode aware. Therefore, you must use a library (like Boost.Filesystem) that is Unicode aware.

Alternatively, you have to deal with platform-specific issues. Windows supports UTF-16, so if you have UTF-8 strings, you need to convert them to UTF-16 (std::wstring). Then you pass those as filenames to the iostream file opening functions. Visual Studio's version of the file streams can take a wchar_t* for the filename.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文