簡體   English   中英

std :: codecvt和std :: codecvt_utf8有什么區別

[英]what's the difference between std::codecvt and std::codecvt_utf8

有一個問題讓我感到困惑。 std :: codecvt和std :: codecvt_utf8之間的確切區別是什么? 正如STL參考所言,std :: codecvt_utf8是std :: codecvt的驅動類,但是您能告訴我為什么這個函數會引發異常嗎?

std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> cvtUtf8 { new std::codecvt_byname<wchar_t, char, std::mbstate_t>(".65001") };
std::wstring_convert<std::codecvt_utf8<wchar_t>> cvt_utf8;

std::string strUtf8 = cvt_utf8.to_bytes(L"你好");
std::string strUtf8Failed = cvtUtf8.to_bytes(L"你好"); // throw out an exception. bad conversion

codecvt是一個模板,旨在用作轉換構面的基礎,用於在不同編碼和不同大小的代碼單元之間轉換字符串。 它具有受保護的析構函數,實際上阻止了它的使用而不繼承。

特別是codecvt<wchar_t, char, mbstate_t>用於在系統的本機寬字符集和單字節窄字符集之間進行轉換的轉換方面。

codecvt_utf8繼承了codecvt ,其構面是用於“ UTF-8編碼的字節字符串和UCS2或UCS4字符串”之間的轉換 它有一個公共破壞者。

如果系統本機窄編碼不是UCS2或UCS4,或者系統本機窄編碼不是UTF-8,則它們會執行不同的操作。


你能告訴我為什么這個函數會拋出異常嗎?

可能是因為C ++源文件未使用與轉換器期望的輸入相同的編碼進行編碼。


 new std::codecvt<wchar_t, char, std::mbstate_t>(".65001") 

codecvt沒有接受字符串的構造函數。


可能值得注意的是,自C ++ 17起, codecvtwstring_convert已被棄用。

哪個是代替codecvt的?

標准委員會選擇在提供替代方法之前棄用codecvt 您可以繼續使用它-知道將來可能會被其他東西取代,並且知道它具有嚴重的缺點(可能會導致棄用),或者您可以做C ++ 11之前可以做的事情:自己實施轉換,或使用第三方實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM