2013-02-12 67 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'; 
    } 
} 

我感到非常震驚意識到時,該區域名稱不標準可言,我Windows 7 Professional(SP1)(西班牙語區域設備)下的Visual Studio 10.0的語言環境名稱格式爲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

最令人沮喪的是,試圖得到支持的語言環境的標準,跨平臺的表,最好的一個,我發現谷歌搜索以防萬一是this one列出的語言環境爲Windows和其等同於無視窗,但缺乏很多國家(如美國,危地馬拉,墨西哥......)。

我試過的另一件事是調試一步一步的std::locale構造函數,希望找到一段代碼,說什麼區域設置名稱是有效的,其中一個不是。我期待着大量的語言環境名稱(例如示例代碼中的一個),但我被構造函數的複雜性所嚇倒並逃離了。

所以我的問題是:

  • 至極的是,你知道和使用的跨平臺語言環境的最好,最完整的表?
  • 如何知道正在運行的系統支持的區域設置?如何訪問受支持的語言環境列表?

額外的問題:

  • 爲什麼語言環境名稱不規範(授予跨平臺的源代碼)?
  • Ideone使用了哪些語言環境系統?

謝謝。

回答

2

在UNIX-y系統上,您通過運行locale -a獲得區域設置列表,這也是man setlocale推薦的。我不認爲C庫甚至有一個語言環境列表,因爲它在運行時在/usr/lib/locale中查找它們。

從本質上講,這意味着你不能在編譯時知道語言環境列表,因爲它是目標系統的運行時功能。