Какие имена std :: locale доступны в обычных компиляторах Windows? - PullRequest
30 голосов
/ 10 декабря 2010

Стандарт в значительной степени ничего не говорит о том, что составляет действительное имя локали;только передача неправильного имени локали приводит к std::runtime_error.Какие имена локалей можно использовать в распространенных компиляторах Windows, таких как MSVC, MinGW и ICC?

Ответы [ 3 ]

23 голосов
/ 21 декабря 2010

Хорошо, есть различие между локалями C и C ++.

Давайте начнем:

  • MSVC C ++ std :: locale и C setlocale

    Принимает имена локалей как «Language [_Country] [. Codepage]», например «English_United States.1251». В противном случае будет выброшено. Примечание: кодовая страница не может быть 65001 / UTF-8 и должна соответствовать кодовой странице ANSI для этой локали (или просто не указывать)

  • MSVC C ++ std :: locale и C setlocale в Vista и 7 должны принимать локали [Язык] [- Сценарий] [- Страна] как "en-US" с использованием кодов языка ISO-631 и ISO 3166 регионов и имена сценариев.

    Я протестировал его с Visual Studio на Windows 7 - он не работает.

  • MinGW C ++ std :: locale принимает "C" и "POSIX", он не поддерживает другие локали, фактически gcc поддерживает локали только над библиотекой GNU C - в основном только под Linux.

    setlocale является родным вызовом Windows API, поэтому должен поддерживать все, что я упомянул выше.

    Может поддерживать более широкий диапазон локалей при использовании с альтернативными библиотеками C ++ например, Apache stdcxx или STL Port.

  • ICC - я не тестировал его, но это зависит от стандартной библиотеки C ++, которую он использует. За Например, под Linux он использовал GCC libstdc ++, поэтому он поддерживает все локали gcc поддерживает. Я не знаю, какую стандартную библиотеку C ++ она использует под Windows.

Если вы хотите, чтобы поддержка локалей поддерживалась компилятором и платформой (и на самом деле гораздо лучшая поддержка) посмотрите Boost.Locale

Артём

20 голосов
/ 20 декабря 2010

Я считаю, что вам нужна информация здесь :

locale  "lang[_country_region[.code_page]]"
            | ".code_page"
            | ""
            | NULL

На этой странице есть ссылки на:


Хотя мои ответы охватывают setlocale вместоиз std::locale, эта страница MSDN , кажется, подразумевает, что формат действительно тот же:

Объект языкового стандарта класса также хранит имя языкового стандарта как объект строки класса,Использование недопустимого имени локали для создания фасета локали или объекта локали создает объект класса runtime_error.Имя сохраненной локали - «*», если объект локали не может быть уверен, что локаль в стиле C соответствует в точности той, которая представлена ​​объектом. В противном случае вы можете установить соответствующий языковой стандарт в стандартной библиотеке C для объекта locale, вызвав setlocale(LC_ALL, loc.name.c_str).

Также см. эту страницу и этот поток , который показывает, что std::locale внутренне использует setlocale.

10 голосов
/ 12 декабря 2010

Вот одно название локали, которое можно использовать практически везде: "".То есть пустая строка.В отличие от локали "C", которую вы, вероятно, получаете по умолчанию.Пустая строка в качестве аргумента std::setlocale() означает что-то вроде «Использовать предпочтительный языковой стандарт, установленный пользователем или средой».Если вы используете это, недостатком является то, что ваша программа не будет иметь одинаковый вывод везде;положительным моментом является то, что ваши пользователи могут подумать, что это работает так, как они хотят.

...