有一个问题让我感到困惑。 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是一个模板,旨在用作转换构面的基础,用于在不同编码和不同大小的代码单元之间转换字符串。它具有 protected 析构函数,实际上阻止了它的使用而不继承。
codecvt<wchar_t, char, mbstate_t>专门化尤其是“在系统的本机宽字符集和单字节窄字符集之间进行转换”的转换方面。
codecvt_utf8继承了codecvt,其方面是在“UTF-8编码的字节字符串和UCS2或UCS4字符串”之间进行转换。它有一个公共(public)破坏者。

如果系统本机窄编码不是UCS2或UCS4,或者系统本机窄编码不是UTF-8,则它们会执行不同的操作。



可能是因为C++源文件的编码方式与转换器期望输入的编码方式不同。


codecvt没有接受字符串的构造函数。

值得一提的是,自C++ 17起不推荐使用codecvtwstring_convert



标准委员会选择在提供替代方法之前弃用codecvt。您可以继续使用它-知道将来可能会被其他东西取代,并且知道它具有严重的缺点(可能会导致弃用),或者您可以在C++ 11之前做一些:自己实现转换,或使用第三方实现。

关于c++ - std::codecvt和std::codecvt_utf8有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49052824/

10-11 00:22