已弃用 header <codecvt> 替换

Deprecated header <codecvt> replacement

一点前景:我的任务需要将 UTF-8 XML 文件转换为 UTF-16(当然需要适当的 header)。因此,我搜索了将 UTF-8 转换为 UTF-16 的常用方法,发现应该使用 <codecvt>.

中的模板

但是现在 deprecated,我想知道完成相同任务的新的常用方法是什么?

(完全不介意使用 Boost,但除此之外我更喜欢尽可能接近标准库。)

来自 <locale>

std::codecvt 模板本身并未弃用。对于 UTF-8 到 UTF-16,仍然有 std::codecvt<char16_t, char, std::mbstate_t> 专业化。

但是,由于 std::wstring_convertstd::wbuffer_convert 与标准转换方面一起被弃用,因此没有任何简单的方法可以使用这些方面转换字符串。

因此,正如 Bolas 已经回答的那样:自己实施(或者您可以一如既往地使用第三方库)或继续使用已弃用的 API。

新方法是...您自己编写。或者只是依赖已弃用的功能。希望标准委员会实际上不会删除 codecvt,直到有一个正常运行的替代品。

但是目前没有。

别担心。

根据the same information source

this library component should be retired to Annex D, along side , until a suitable replacement is standardized.

因此,在完成新的标准化、更安全的版本之前,您仍然可以使用它。

由于没有人真正回答问题并提供可用的替换代码,这里有一个但它仅适用于 Windows:

#include <string>
#include <stdexcept>
#include <Windows.h>

std::wstring string_to_wide_string(const std::string& string)
{
    if (string.empty())
    {
        return L"";
    }

    const auto size_needed = MultiByteToWideChar(CP_UTF8, 0, &string.at(0), (int)string.size(), nullptr, 0);
    if (size_needed <= 0)
    {
        throw std::runtime_error("MultiByteToWideChar() failed: " + std::to_string(size_needed));
    }

    std::wstring result(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &string.at(0), (int)string.size(), &result.at(0), size_needed);
    return result;
}

std::string wide_string_to_string(const std::wstring& wide_string)
{
    if (wide_string.empty())
    {
        return "";
    }

    const auto size_needed = WideCharToMultiByte(CP_UTF8, 0, &wide_string.at(0), (int)wide_string.size(), nullptr, 0, nullptr, nullptr);
    if (size_needed <= 0)
    {
        throw std::runtime_error("WideCharToMultiByte() failed: " + std::to_string(size_needed));
    }

    std::string result(size_needed, 0);
    WideCharToMultiByte(CP_UTF8, 0, &wide_string.at(0), (int)wide_string.size(), &result.at(0), size_needed, nullptr, nullptr);
    return result;
}