Это вопрос из двух частей, который начался с того, что мне стало интересно: что произойдет, если ввод идентификатора 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
должен быть использован?
Задача ещё не решена.
Других решений пока нет …