C 標準庫的 locale 類用法

2021-07-09 13:37:16 字數 1921 閱讀 8178

原來一篇總結了下 c 標準庫的 setlocale() 用法,這篇講解的是 c++ 標準庫中 locale 類的用法。

locale 類在標頭檔案中宣告,另外可能會用到中的標準異常類,和中的流物件類。

gnu libstdc++ 中的 locale

doxygen 生成的 libstdc++ api 參考:libstdc++ source documentation

locale 類參考:std::locale class reference

locale 物件的構造

建構函式有以下幾個常用的過載形式:

locale 類靜態方法

locale 物件方法

locale 使用示例與問題

locale 類的作用和 setlocale() 相同:一是輸出 wchar_t 字元時,根據活動 locale 將字元從 ucs 編碼轉換為 native ansi 編碼,最後傳遞給終端、控制台裝置;另乙個作用是使用特定 locale 的某些 category 做操作(相應的函式、方法稱為 locale 相關方法),比如:時間、貨幣文字的格式化,排序等等。

使用wcout流物件和 locale 物件,輸出wchar_t型字元限制很大,以下是正確向終端輸出中文的例子:

01constwchar_t* strzh = l"中文abc";

02

03try

04

10catch(runtime_error& e)

11

上面程式的執行環境為:終端和 shell 都使用 zh_cn.utf-8 編碼,最後用重定向輸出到檔案的方法測試出:輸出的文字為 utf-8 編碼。

限制來自於:無法混用 char 和 wchar_t 版的流物件,而很多物件只有返回 string 的方法(比如:locale::name()),導致必須使用 char 版的 cout、cerr 等,或者可以用 string::c_str() 方法。

gnu libstdc++ 中實現的 locale 類,在使用時注意以下問題(vc8 中沒有下面前兩個問題):

windows crt 中的 locale

我在 vc8 下測試,和 gnu libstdc++ 的差異挺大,表現結果是:wcout.imbue(lc) 起作用,可以在控制台中輸出含中文的 wchar_t 型字元,並且控制台得到的是根據 locale 轉換的 native ansi 編碼。windows 的 locale 類實現不支援 utf-8(**頁 65001),所以要用 gbk 的 locale,對應的 locale 名為 chs,長名字:chinese_people's republic of china.936。

用 vc8 的 locale::global(lc) 時有個奇怪的現象,它導致後面的 wcout 流輸出到控制台完全沒有顯示,我將輸出重定向到檔案,發現結果正常,和用 imbue() 輸出的相同,為 gbk 編碼的中文。所以我認為,無法顯示中文字元是 windows 的控制台裝置實現,以及 crt 和控制台裝置互動的問題,crt 根據 locale 轉換編碼的工作是正常的。

另外,vc8 的 cout 和 wcout 的混用,以及 printf() 和 wprintf() 混用,都沒有 gnu 實現的問題

C 標準庫的 locale 類用法

原來一篇總結了下 c 標準庫的 setlocale 用法,這篇講解的是 c 標準庫中 locale 類的用法。參考 locale 類在標頭檔案中宣告,另外可能會用到中的標準異常類,和中的流物件類。gnu libstdc 中的 locale 參考 doxygen 生成的 libstdc api 參考 ...

C 的標準庫的用法

需要包含iomanip標頭檔案 include setprecision n 設定輸出浮點數的精度為n setiosflags ios ios 可以設定多個標籤 resetiosflags ios ios 設定標籤之後可以去除標籤 include 宣告乙個棧 stack stk stk.push 向...

c 標準庫sstream的用法

庫定義了三種類 istringstream ostringstream和stringstream,分別用來進行流的輸入 輸出和輸入輸出操作。另外,每個類都有乙個對應的寬字符集版本。注意,使用string物件來代替字元陣列。這樣可以避免緩衝區溢位的危險。而且,傳入引數和目標物件的型別被自動推導出來,即...