2

这是一个由两部分组成的问题,首先我想知道:如果输入的 IDboost::locale::generator::generate()是一些无效值会发生什么?

我检查了文档,我找不到任何关于如果我们传入类似test而不是en_CA.UTF-8. 我知道没有抛出异常,但我希望它有一些迹象表明语言环境输入无效。

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

下面的代码片段:

#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应该如何使用?

4

0 回答 0