Я тестировал некоторые из новых locale
материалов, предоставленных C++ 11, например std::put_money
, чтобы привыкнуть к их использованию. Я подумал, что было бы неплохо, чтобы показать большое количество напечатанного в качестве валюты для всех стран, поддерживаемых в стандартной библиотеке:Кросс-платформенная таблица локалей
const char *Locales[] =
{
"English_Australia.1252",
"en_EN",
"fr_FR.UTF-8"
/...
// lots of lots of worldwide locales
};
int main(int argc, char **argv)
{
for (const char **Locale = std::begin(Locales); Locale != std::end(Locales); ++Locale)
{
std::stringstream ss;
ss.imbue(std::locale(*Locale))
std::cout << *Locale << ' '
<< std::showbase << std::put_money(11223344556677889900) << '\n';
}
}
Я был в шоке, когда понял, что имена локалей не являются стандартными на всех, для моих Visual Studio 10.0 под Windows 7 Professional (SP1) (испанский языковой стандарт) имена локалей следует за форматом Language_Region.charsetID
, например: English_Australia.1252
, на моей машине Linux (Debian 4.2.2) с gcc 4.2.3 локали следуют в том же формате, но с две буквы xx_XX.UTF-8
(например, es_ES.UTF-8
), а при попытке кода на Ideone единственная локаль, которая, кажется, принимает, - en_US.UTF-8
.
Самая неприятная часть, чтобы попытаться получить таблицу стандартных, кросс-платформенный поддерживаемых локалей, лучший один я нашел погуглить Arround является this one, который перечисляет локали для Windows, и их эквиваленты в не-Windows,, но не хватает большого количества стран (таких как США, Гватемала, Мексика ...).
Еще одна вещь, которую я пробовал - это отладку поэтапного конструктора std::locale
с надеждой найти фрагмент кода, в котором говорится, что имя языкового стандарта действительно и которое не является. Я ожидал гигантский массив имен локалей (например, один в примере кода), но я был напуган сложностью конструктора std::locale
и убежал.
Так что мои вопросы:
- Wich является лучшим и наиболее полная таблица кросс-платформенных районов, которые вы знаете и использовать?
- Как узнать локали, поддерживаемые работающей системой? Как получить доступ к списку поддерживаемых локалей?
Дополнительные вопросы:
- Почему имена локалей не являются стандартными (предоставление исходного кода кроссплатформенного)?
- Какая система языкового стандарта используется Ideone?
Спасибо.