提问人:Martin Fehrs 提问时间:11/29/2020 最后编辑:Martin Fehrs 更新时间:11/29/2020 访问量:59
如何检测和处理算法中不支持的区域设置?
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 语言环境。
答:
2赞
Martin Fehrs
11/29/2020
#1
标准库没有独立于平台的方法来检测区域设置是否为 UTF-8。只有一个 name 方法返回依赖于平台的名称。即使它是 POSIX 名称,也不能保证编码是区域设置名称的一部分。
Boost.Locale 提供了一个额外的方面,称为保存有关当前区域设置的详细信息。https://www.boost.org/doc/libs/1_70_0/libs/locale/doc/html/locale_information.htmlboost::locale::info
您可以像这样获取信息:
std::use_facet<boost::locale::info>(some_locale).utf8()
如果没有信息方面,则 std::use_face 抛出 std::bad_cast。在这种情况下,它不是 Boost 区域设置,您不走运。在这种情况下,投掷是一种合理的行为。您可以抓住bad_cast并抛出一个信息量更大的异常。如果有 info 方面,您可以检查 utf8() 的返回值。如果它返回 false,则当前语言环境不兼容,您也应该抛出。否则,您的算法可以毫无问题地运行。
评论