C++ std::codecvt和std::codecvt_utf8之间有什么区别

C++ std::codecvt和std::codecvt_utf8之间有什么区别,c++,unicode,utf-8,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, cha

有一个问题让我感到困惑。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是一个模板,用作转换方面的基础,用于在不同编码和不同大小的代码单元之间转换字符串。它有一个受保护的析构函数,这实际上防止在没有继承的情况下使用它

codecvt专门化尤其是一个转换方面,用于在系统的本机宽字符集和单字节窄字符集之间进行转换

codecvt_utf8继承codecvt,is方面用于UTF-8编码字节字符串和UCS2或UCS4字符串之间的转换。它有一个公共析构函数

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

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

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

可能是因为C++源文件没有被编码在转换器期望输入为的相同编码中。

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

值得注意的是,codecvt和wstring_convert自C++17以来就被弃用了

哪一个是代替codecvt的


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

当我们将字符串发送到codecvt时,存在隐式转换。codecvt接受_Locinfo,_Locinfo接受const char*。还有一个问题:codecvt从C++17开始就被弃用了,哪一个是代替codecvt的?@P.Wang在标准库中既没有constructor,也没有像_Locinfo这样的类型。如果您使用非标准扩展,您应该在问题中提及。@P.Wang我用您的问题扩展了答案。嗯。。。我知道cppreference.com谈论UCS-2,但是。。。你真的确定这就是他们的意思吗?不是UTF-16?这两者并不完全相同,UTF-16、UCS-2中非BMP代码点的代理项对之间的差异(仅限于BMP)可能非常重要。。。与UCS-4和UTF-32相反,它们在所有实际用途上都是相同的。@DevSolar我确实引用了CPPPreference逐字逐句的话,可能应该引用。我现在检查了标准,它明确地说是UCS-2,所以CPPPreference似乎是准确的。至少我希望这个标准是言行一致的。