Это вопрос из двух частей, который начался с того, что мне стало интересно: что произойдет, если для идентификатора, введенного в 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
?