Подтвердить что ты не робот

Какие имена std:: locale доступны в общих компиляторах Windows?

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

4b9b3361

Ответ 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() означает нечто вроде "Использовать предпочтительную локаль, установленную пользователем или средой". Если вы используете это, недостатком является то, что ваша программа не будет иметь одинаковую производительность во всем мире; что ваши пользователи могут подумать, что они работают так, как они хотят.