locale的使用總結(轉自http://www.tucue.net/showtopic-371.aspx)

locale 是多種 facet 的容器,每種 facet 管理與 locale 相關的一種功能。
facet 除了按名稱區別外,更常用的是按 category 來分類。分類情況如下:

locale::ctype 類別,包括以下 facet 模板
ctype // 字符分類和轉換
codecvt // 字符編碼轉換
locale::collate 類別,包括以下 facet 模板
collate // 字符串校對
locale::message 類別,包括以下 facet 模板
messages // 從信息目錄中獲得本地化信息
locale::numeric 類別,包括以下 facet 模板
numpunct // 有關數字和布爾運算表達式中標點符號及格式信息
num_get // 代表數字或布爾值的字符串的解析
num_put  // 代表數字或布爾值的格式化字符串的生成
locale::monetary 類別,包括以下 facet 模板
moneypunct // 貨幣表達式中的標點符號及格式
money_get  // 代表貨幣值的字符串的解析
money_put  // 代表貨幣值的格式化字符串的生成
locale::time 類別,包括以下 facet 模板
time_get // 代表日期和時間的字符串的解析
time_put // 代表日期和時間的格式化字符串的生成

使用方法:
locale 對象是不可變的,即在它們的生命週期中,它們的內容不可改變。所包含的 facet 不能進行修改或替換,同時 facet 不能增加或刪除。
鑑於以上特性,在使用 locale 時一般都是根據需要生成新的 locale 對象,然後選入IO流中。因此 locale 的構造函數就變得十分多樣,方便我們以各種形式構造所需要的locale 對象。
例如,需要 std::wostream 輸出中文,我們就需要 locale("chs") 中編碼轉換相關的功能,但若直接選擇 locale("chs"),輸出數字時也會進行轉換處理,例如將 1234 輸出爲 "1,234"。爲了避免這一轉換,就需要保留原 locale("C") 中除了字符相關的其他facet。如下處理即可
locale loc("chs", locale::ctype);
此函數以 global 對應的 locale (一般是 locale("C") ) 初始化 loc 並選擇 locale("chs") 的字符相關 facet ,這樣我們就可以用 loc 正確輸出中文,並保持輸出數字時不進行其他處理
其他可參閱 MSDN 中關於 locale 的構造函數說明,解釋很詳細,用法很簡單。
此外,locale 對象還可使用 combine 成員函數 選取其他 locale 中指定 facet 進行組合。總之接口多樣,不過也一定程度上增加了對 locale 學習的複雜性。

最後,還有更簡便的解決方案,即全局 locale 對象。
如果你建立了一個流對象,並且沒有規定流使用的 locale 對象,那麼流使用全局 locale 對象。如果我們在程序開始處改變全局 locale 對象爲我們需要的形式,以後就不需再反覆設定每個流的 locale 了。如
locale::global(locale("",locale::ctype));
除了將字符處理部分改爲當前系統默認的編碼方式外其他不變,這樣一般就滿足需求了。
再加一條,當流建立後再改變全局locale,則對已建立的流無影響。還有改變 C++ 的全局 locale 對象可能會影響 C 的全局 locale 設定,請不要混用。既然用 locale 對象,就全部採用 C++ 的風格吧

發佈了116 篇原創文章 · 獲贊 4 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章