我有一个带有以下签名的函数:
template <typename Container>
void write_cards_as_xml(const Container& cards, std::ostream& os);
内部调用:
boost::property_tree::ptree root;
...
boost::property_tree::write_xml(os, root);
write_xml函数对编码一无所知。默认情况下,它假定为UTF-8,但不进行任何转换。这取决于os的语言环境。我不确定如何处理不受支持的非UTF-8语言环境。我可以检测它是否不是UTF-8吗?如果没有,我应该扔吗?我应该暂时将语言环境替换为我喜欢的编码吗?我正在使用Boost语言环境。
标准库没有检测语言环境是否为UTF-8的独立于平台的方法。只有一个name方法可以返回依赖于平台的名称。即使它是POSIX名称,也不能保证编码是语言环境名称的一部分。
Boost.Locale提供了一个附加方面,称为boost::locale::info
保存有关当前语言环境的详细信息。
https://www.boost.org/doc/libs/1_70_0/libs/locale/doc/html/locale_information.html
你可以获取如下信息:
std::use_facet<boost::locale::info>(some_locale).utf8()
如果没有信息构面,则std :: use_face会引发std :: bad_cast。在这种情况下,它不是Boost语言环境,那么你就不走运了。在这种情况下,投掷是一种合理的行为。你可以捕获bad_cast并引发更多信息性异常。如果有信息方面,则可以检查utf8()的返回值。如果返回false,则当前语言环境不兼容,你也应该抛出该错误。否则,你的算法可以毫无问题地运行。