我们可以检查boost :: locale :: generator :: generate的语言环境输出是否无效?

时间:2018-10-09 21:13:49

标签: c++ boost locale collator

这是一个由两部分组成的问题,使我开始怀疑:如果输入boost::locale::generator::generate()的ID是某个无效值,会发生什么?

我检查了documentation,但是如果我们传递类似test而不是en_CA.UTF-8的信息,我什么都找不到。我知道不会引发任何异常,但是我希望它会在某种程度上表明语言环境输入无效。

我对此进行了尝试,后来意识到当我尝试将生成的语言环境与整理器compare函数一起使用时出现问题。会引发访问冲突异常。

下面的代码段

#include <string>
#include "boost/locale.hpp"
#include "boost/locale/collator.hpp"

using namespace boost::locale;

void InitializeLocale( const std::string zLanguage, const std::string zCountry, std::locale & out_Locale )
{
    generator gen;
    gen.categories( collation_facet | formatting_facet | convert_facet );

    //out_Locale = gen( zLanguage + "_" + zCountry + ".UTF-8" );
    out_Locale = gen( "test" );

    // TODO: Check if out_Locale is valid??
    std::locale::global( out_Locale );
}

int main( int iNumArgs, char ** azArgs )
{
    std::locale currentLocale;
    InitializeLocale( "en", "CA", currentLocale );

    // Works
    std::cout << boost::locale::to_upper( "test", currentLocale ) << std::endl;
    // Throws exception: Exception thrown at 0x00007FF6FFFCB8C2 in TestProgram.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
    std::use_facet<boost::locale::collator<char>>( currentLocale ).compare( collator_base::secondary, "test", "TEST");
}

问题的第二部分解决了我更为迫切的问题:是否可以检查生成的语言环境是否无效?

我可以控制现在传入的语言环境ID,但是将来肯定会改变。

或者,也许我不了解应如何使用boost::locale::collator

0 个答案:

没有答案