C ++ Сохранение файла с проблемой с именами Юникода - Как правильно сохранить имена файлов UTF-8 в кроссплатформенном виде? - PullRequest
5 голосов
/ 07 августа 2011

Я хочу сохранить файл с именем Привет Мир.jpg Я получаю строку (например, прочитать ее из файла) (с Юникодом в ней), но мой код 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, так что ... Что мне теперь делать?

1 Ответ

5 голосов
/ 07 августа 2011

Стандартная библиотека C ++ не поддерживает Unicode. Следовательно, вы должны использовать библиотеку (например, Boost.Filesystem), которая поддерживает Unicode.

В качестве альтернативы, вам приходится иметь дело с проблемами, связанными с платформой. Windows поддерживает UTF-16, поэтому, если у вас есть строки UTF-8, вам необходимо преобразовать их в UTF-16 (std :: wstring). Затем вы передаете их как имена файлов в функции открытия файлов iostream. Версия файловых потоков Visual Studio может принимать wchar_t* для имени файла.

...