有一个问题让我感到困惑。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发布于 2018-03-01 15:54:29
codecvt是一个模板,用作转换方面的基础,用于在不同编码和不同大小的代码单元之间转换字符串。它有一个受保护的析构函数,这实际上防止了在没有继承的情况下使用它。
特别是codecvt<wchar_t, char, mbstate_t>专门化是一个转换方面,用于“系统的本机宽度和单字节窄字符集之间的转换”。
codecvt_utf8继承codecvt,is facet用于"UTF-8编码字节字符串和UCS2或UCS4字符串“之间的转换。它有一个公共破坏者。
如果系统本机wide编码不是UCS2或UCS4,或者如果系统本机窄编码不是UTF-8,那么它们会做不同的事情。
你能告诉我为什么这个函数会抛出异常吗?
可能是因为C++源文件没有按照转换器期望输入的相同编码编码。
新std::codecvt(".65001")
codecvt没有接受字符串的构造函数。
值得注意的是,codecvt和wstring_convert自C++17以来就不再受欢迎了。
哪一种代替编码?
标准委员会在提供替代方案之前,选择了反对codecvt。您可以继续使用它--知道它将来可能被其他东西所取代,并且知道它有严重的缺点,这是不推荐的原因--或者您可以在C++11之前做您可以做的事情:自己实现转换,或者使用第三方实现。
https://stackoverflow.com/questions/49052824
复制相似问题