什么是std :: codecvt和std :: codecvt_utf8之间的区别

时间:2018-03-01 15:16:25

标签: c++ unicode utf-8

有一个问题让我感到困惑。 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

1 个答案:

答案 0 :(得分:4)

codecvt是一个模板,旨在用作转换方面的基础,用于在不同编码和不同大小的代码单元之间转换字符串。它有一个受保护的析构函数,实际上可以防止它在没有继承的情况下被使用。

codecvt<wchar_t, char, mbstate_t>特殊化是一个转换方面,用于&#34;系统的原生广泛和单字节窄字符集之间的转换&#34; 。 / p>

codecvt_utf8继承codecvt,facet用于在&#34; UTF-8编码的字节字符串和UCS2或UCS4字符串&#34; 之间进行转换。它有一个公共析构函数。

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

  你可以告诉我为什么这个函数会抛出异常吗?

可能是因为C ++源文件没有按照转换器期望输入的相同编码进行编码。

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

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

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

  

哪一个代替了codecvt?

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