Почему std :: locale loc ("en_US") генерирует исключение? - PullRequest
6 голосов
/ 11 июля 2010

Я пытался создать экземпляр объекта std::locale с использованием строки американского или британского языка.
И std::locale loc("en_US"), и std::locale loc("en_GB") выдают неверное имя локали исключение времени выполнения. Создание локали с использованием "" или "C" работает нормально; однако у меня возникают проблемы с настройкой локали отдельной страны.

Причина, по которой я хотел бы сделать это, - в целях модульного тестирования, чтобы убедиться, что набор методов сортировки строк работает правильно.

Я должен также указать, что я пишу в Windows с использованием Visual Studio 2008, и я хотел бы сохранить свой код кросс-платформенным, если это возможно.

Ответы [ 2 ]

6 голосов
/ 16 марта 2015

Для этого лучше использовать boost.locale, который использует библиотеку ICU. ICU предоставляет множество локалей и не зависит от используемой вами ОС. Для генерации std :: locale вам нужно написать:

boost::locale::generator gen;
std::locale loc = gen("en_US");

Для получения дополнительной информации: http://www.boost.org/doc/libs/1_57_0_b1/libs/locale/doc/html/index.html

6 голосов
/ 11 июля 2010

Строки, которые поддерживает std::locale, зависят от реализации;может случиться так, что реализация не поддерживает строку, которую вы передаете в качестве аргумента.

Поскольку вы программируете в Windows, вас может заинтересовать Language Strings , в которой перечислены используемые идентификаторы языкаsetlocal и Строки страны / региона для идентификаторов страны.Насколько я вижу, идентификаторы языка используют дефис (например, en-US , nl-BE и zh-HK ).

Вы можете найти больше информации о std :: locale :: global (std :: locale ("zh-CN")) Получает "Неверное имя локали" ??

...