2013-02-12 2 views
1

Я тестировал некоторые из новых 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?

Спасибо.

ответ

2

В системах UNIX-y вы получаете список локалей, запустив locale -a, что также рекомендуется man setlocale. Я не думаю, что у библиотеки C даже есть список локалей, потому что она просматривает их во время выполнения в /usr/lib/locale.

По сути, это означает, что вы не можете знать список локалей во время компиляции, потому что это функция времени выполнения вашей целевой системы.

Смежные вопросы