xml*_*lmx 24
别担心.
根据相同的信息来源:
该库组件应随后退回附件D, 直到合适的替代品标准化.
因此,您仍然可以使用它,直到完成新的标准化,更安全的版本.
eer*_*ika 18
std::codecvt
<locale>
不推荐使用自己的模板.对于UTF-8到UTF-16,仍然有std::codecvt<char16_t, char, std::mbstate_t>
专业化.
但是,由于std::wstring_convert
并且std::wbuffer_convert
与标准转换方面一起被弃用,因此没有任何简单的方法来使用构面转换字符串.
因此,正如Bolas已经回答的那样:自己实施(或者你可以像往常一样使用第三方库)或继续使用已弃用的API.
Bul*_*aza 17
由于没有人真正回答这个问题并提供可用的替换代码,这里有一个但仅适用于 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.data(), (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.data(), (int)string.size(), result.data(), 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.data(), (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.data(), (int)wide_string.size(), result.data(), size_needed, nullptr, nullptr);
return result;
}
Run Code Online (Sandbox Code Playgroud)
新方法是……你自己写。或者只是依赖已弃用的功能。希望标准委员会不会真正删除codecvt,直到有一个功能性的替代品。
但目前,没有。