Warm tip: This article is reproduced from serverfault.com, please click

c++-如何检测和处理算法中不受支持的语言环境?

(c++ - how to detect and handle unsupported locales in algorithms?)

发布于 2020-11-29 13:43:06

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

 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语言环境。

Questioner
Martin Fehrs
Viewed
0
Martin Fehrs 2020-11-29 23:44:47

标准库没有检测语言环境是否为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,则当前语言环境不兼容,你也应该抛出该错误。否则,你的算法可以毫无问题地运行。