Можем ли мы проверить, является ли вывод локали из boost :: locale :: generator :: generate недействительным? - PullRequest
0 голосов
/ 10 октября 2018

Это вопрос из двух частей, который начался с того, что мне стало интересно: что произойдет, если для идентификатора, введенного в boost::locale::generator::generate(), указано какое-то недопустимое значение?

Я проверил документацию и не смогне найти ничего о том, что произойдет, если мы передадим что-то вроде 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");
}

Вторая часть вопроса касается моей более насущной проблемы: возможно ли проверить, является ли сгенерированный языковой стандарт недействительным илине так?

Я точно контролирую, какой идентификатор локали передается прямо сейчас, но это определенно изменится в будущем.

Или, возможно, я не понимаю, как использовать boost::locale::collator?

...