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

how to detect and handle unsupported locales in algorithms?

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

 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。只有一个名称方法 return 是一个平台相关的名称。即使它是 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() 的 return 值。如果它 returns false 当前语言环境不兼容,你也应该抛出。否则你的算法可以 运行 没有问题。