[英]Deprecated header <codecvt> replacement
有點前景:我的任務需要將 UTF-8 XML 文件轉換為 UTF-16(當然還有適當的標頭)。 因此,我搜索了將 UTF-8 轉換為 UTF-16 的常用方法,並發現應該使用<codecvt>
模板。
但是現在當它被 棄用時,我想知道完成相同任務的新常見方法是什么?
(完全不介意使用 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,直到有一個功能性的替代品。
但目前,沒有。
由於沒有人真正回答這個問題並提供可用的替換代碼,這里有一個但僅適用於 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.