gpt4 book ai didi

c++ - std::codecvt 和 std::codecvt_utf8 有什么区别

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:20 25 4
gpt4 key购买 nike

有一个问题让我感到困惑。 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>专门化是“系统的 native 宽字符集和单字节窄字符集之间的转换”的转换方面

codecvt_utf8继承codecvt and is facet用于“UTF-8编码字节串和UCS2或UCS4字符串”之间的转换。它有一个公共(public)析构函数。

如果系统 native 宽编码不是 UCS2 或 UCS4,或者如果系统 native 窄编码不是 UTF-8,那么它们会做不同的事情。


could you please tell me why this function would throw an exception?

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


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

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


可能值得注意的是 codecvtwstring_convert自 C++17 以来已被弃用。

which one is the instead of codecvt?

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com