C++ 如何在算法中检测和处理不受支持的区域设置?

C++ 如何在算法中检测和处理不受支持的区域设置?,c++,boost,encoding,locale,iostream,C++,Boost,Encoding,Locale,Iostream,我有一个具有以下签名的函数: template <typename Container> void write_cards_as_xml(const Container& cards, std::ostream& os); write_xml函数对编码一无所知。默认情况下,它采用UTF-8,但不进行任何转换。这取决于操作系统的语言环境。我不知道如何处理不受支持的非UTF-8语言环境。我能检测出它是否不是UTF-8吗?如果不是,我应该扔吗?是否应将区域设置临时替换

我有一个具有以下签名的函数:

 template <typename Container>
 void write_cards_as_xml(const Container& cards, std::ostream& os);

write_xml函数对编码一无所知。默认情况下,它采用UTF-8,但不进行任何转换。这取决于操作系统的语言环境。我不知道如何处理不受支持的非UTF-8语言环境。我能检测出它是否不是UTF-8吗?如果不是,我应该扔吗?是否应将区域设置临时替换为首选编码?我正在使用boost语言环境。

标准库没有独立于平台的方法来检测语言环境是否为UTF-8。只有一个name方法返回与平台相关的名称。即使是POSIX名称,也不能保证编码是语言环境名称的一部分

Locale提供了一个名为
Boost::Locale::info
的额外方面,其中包含有关当前语言环境的详细信息。

您可以获得如下信息:

std::use_facet<boost::locale::info>(some_locale).utf8()
std::使用方面(某些语言环境).utf8()
如果没有信息方面std::use_face throws std::bad_cast。在这种情况下,这不是一个提升区域设置,你运气不好。在这种情况下,投掷是一种合理的行为。您可以捕获错误的_类型转换,并抛出一个信息更丰富的异常。如果存在信息方面,则可以检查utf8()的返回值。如果返回false,则当前区域设置不兼容,您也应该抛出。否则,您的算法可以毫无问题地运行

std::use_facet<boost::locale::info>(some_locale).utf8()