首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::codecvt和std::codecvt_utf8有什么区别?

std::codecvt和std::codecvt_utf8有什么区别?
EN

Stack Overflow用户
提问于 2018-03-01 15:16:25
回答 1查看 3.5K关注 0票数 2

有一个问题让我感到困惑。std::codecvt和std::codecvt_utf8之间到底有什么区别?正如STL引用中所说的,std::codecvt_utf8是来自std::codecvt的驱动类,但是您能告诉我为什么这个函数会抛出异常吗?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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没有接受字符串的构造函数。

值得注意的是,codecvtwstring_convert自C++17以来就不再受欢迎了。

哪一种代替编码?

标准委员会在提供替代方案之前,选择了反对codecvt。您可以继续使用它--知道它将来可能被其他东西所取代,并且知道它有严重的缺点,这是不推荐的原因--或者您可以在C++11之前做您可以做的事情:自己实现转换,或者使用第三方实现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49052824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档