Стандарт в значительной степени умалчивает о том, что представляет собой действительное имя локали; только при передаче недопустимого имени локали в std::runtime_error
. Какие имена локалей можно использовать для общих компиляторов Windows, таких как MSVC, MinGW и ICC?
Какие имена std:: locale доступны в общих компиляторах Windows?
Ответ 1
Я считаю, что вам нужна информация здесь:
locale "lang[_country_region[.code_page]]"
| ".code_page"
| ""
| NULL
На этой странице приведены ссылки на:
Хотя мои ответы охватывают setlocale
вместо std::locale
, эта страница MSDN, похоже, подразумевает, что формат действительно тот же:
Объект класса locale также сохраняет имя локали как объекта класса строка. Использование недопустимого имени локали для построения языкового грани или объект locale бросает объект class
runtime_error
. Сохраненный имя локали "*", если локаль объект не может быть уверен, что Язык C-стиля точно соответствует который представлен объектом. В противном случае вы можете установить соответствующий языковой стандарт в стандарте C Библиотека, для locale object loc, by вызовsetlocale(LC_ALL, loc.name.c_str)
.
Также см. эту страницу и этот поток, который имеет тенденцию чтобы показать, что std::locale
внутренне использует setlocale
.
Ответ 2
Хорошо, есть разница между локалями C и С++.
Пусть начало:
-
MSVC С++ std:: locale и C setlocale
Принимает имена локалей как "Язык [_Country] [.Codepage]", например "English_United States.1251" В противном случае будет выбрасываться. Примечание: кодовая страница не может быть 65001/UTF-8 и должна соответствовать кодовой странице ANSI для этой локали (или просто опущена)
-
MSVC С++ std:: locale и C setlocale в Vista и 7 должны принимать локали [Язык] [- Script] [- Страна], например, "en-US", используя коды языка ISO-631 и ISO 3166 и script.Я тестировал его с помощью Visual Studio в Windows 7 - он не работает.
-
MinGW С++ std:: locale принимает "C" и "POSIX", он не поддерживает другие локали, на самом деле gcc поддерживает локали только по библиотеке GNU C - в основном только под Linux.
setlocale - это родной вызов Windows API, поэтому он должен поддерживать все, о чем я упоминал выше.
Он может поддерживать более широкий диапазон локалей при использовании с альтернативными библиотеками на С++ как Apache stdcxx или STL-порт.
-
ICC - я не тестировал его, но он зависит от стандартной библиотеки С++, которую он использует. Для пример под Linux он использовал GCC libstdС++, поэтому он поддерживает все локали gcc поддерживает. Я не знаю, какую стандартную библиотеку С++ он использует в Windows.
Если вы хотите, чтобы поддержка независимых локалей "компилятор и платформа" (и фактически гораздо лучше поддерживать) взгляните на Boost.Locale
Артем
Ответ 3
Здесь одно имя локали, которое можно использовать в любом месте: ""
. То есть пустая строка. В отличие от локали "C"
, которую вы, вероятно, получаете по умолчанию. Пустая строка в качестве аргумента для std::setlocale()
означает нечто вроде "Использовать предпочтительную локаль, установленную пользователем или средой". Если вы используете это, недостатком является то, что ваша программа не будет иметь одинаковую производительность во всем мире; что ваши пользователи могут подумать, что они работают так, как они хотят.