我發現了一堆關于類似主題的問題,但沒有關于寬到寬轉換的問題<codecvt>,這應該是現代代碼中的正確選擇。
這std::codecvt_utf16<wchar_t>似乎是執行轉換的合乎邏輯的選擇。
然而,std::wstring_convert似乎期待std::string在某一端。方法from_bytes和to_bytes強調這個目的。
我的意思是,到目前為止,最好的解決方案是類似的std::copy,它可能適用于我的具體情況,但似乎技術含量低,也可能不太正確。
我有一種感覺,我錯過了一些相當明顯的東西。
干杯。
uj5u.com熱心網友回復:
和std::wstring_convert類std::codecvt...在 C 17 以后被棄用。不再有在各種字串類之間進行轉換的標準方法。
如果你的編譯器仍然支持這些類,你當然可以使用它們。但是,您不能使用它們直接從std::u16stringto轉換std::wstring(反之亦然)。您必須先轉換為中間 UTF-8 std::string,然后再轉換,例如:
std::u16string utf16 = ...;
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;
std::string utf8 = utf16conv.to_bytes(utf16);
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> wconv;
std::wstring wstr = wconv.from_bytes(utf8);
只要知道當類最終從標準庫中洗掉時,這種方法就會中斷。
使用std::copy()(或只是各種std::wstring資料構造/分配方法)僅適用于 Windows,其中wchar_t和char16_t都是 16 位大小,表示 UTF-16:
std::u16string utf16 = ...;
std::wstring wstr;
#ifdef _WIN32
wstr.reserve(utf16.size());
std::copy(utf16.begin(), utf16.end(), std::back_inserter(wstr));
/*
or: wstr = std::wstring(utf16.begin(), utf16.end());
or: wstr.assign(utf16.begin(), utf16.end());
or: wstr = std::wstring(reinterpret_cast<const wchar_t*>(utf16.c_str()), utf16.size());
or: wstr.assign(reinterpret_cast<const wchar_t*>(utf16.c_str()), utf16.size());
*/
#else
// do something else ...
#endif
但是,在其他平臺上,wchar_t32 位大小表示 UTF-32,您將需要使用上面顯示的代碼,或者可以進行資料轉換的特定于平臺的 API 或 3rd 方 Unicode 庫來實際轉換資料,如libiconv,ICU。等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418877.html
標籤:
下一篇:用字串填充Double串列
