已弃用 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_convert
和 std::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;
}
一点前景:我的任务需要将 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_convert
和 std::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;
}