標頭檔案

<locale>

本地化庫
本地化環境(locale)是一組特定於文化的特性,程式可以使用這些特性使其在國際上更具可移植性。

在 C++ 中,本地化環境由 locale 類的物件表示。每個 locale 物件都包含使用一組依賴於文化的特性所需的所有資訊。但 locale 物件並不直接將這些特性作為成員函式包含在內:相反,locale 物件包含有關其選擇哪些刻面(facet)物件的資訊,而正是這些刻面物件將特定特性實現為成員函式。這使得多個本地化環境可以透過使用相同的刻面對象來共享通用特性,並使其具有可擴充套件性,允許將自定義刻面新增到 locale 物件中。

刻面分為六個標準類別

類別刻面成員函式
collatecollatecomparehashtransform
ctypectypeisnarrowscan_isscan_nottolowertoupperwiden
codecvtalways_noconvencodinginlengthmax_lengthoutunshift
貨幣moneypunctcurr_symboldecimal_pointfrac_digitsgroupingnegative_signneg_formatpositive_signpos_formatthousands_sep
money_getget
money_putput
數值numpunctdecimal_pointfalsenamegroupingthousands_septruename
num_getget
num_putput
時間time_getdate_orderget_dateget_monthnameget_timeget_weekdayget_year(以及自 C++11 起的 get
time_putput
messagesmessagesclosegetopen

Locale 物件可以完全透過一個名稱來構造,從而獲得該指定本地化環境的所有特性,也可以混合不同本地化環境的刻面類別(更多資訊請參見類 locale 建構函式)。

因此,C++ 中本地化功能的核心是在不同的刻面中實現的。刻面是物件。這些物件由本地化引擎自動管理,因此刻面對象通常不會在程式中區域性構造或複製(實際上,它們的受保護解構函式會阻止程式這樣做)。訪問與某個本地化環境關聯的刻面的特定特性的最通用方法是使用函式 use_facet

1
2
3
4
5
6
// using facet member directly:
myvar = use_facet < numpunct<char> > (mylocale).decimal_point();

// alias facet:
const numpunct<char>& myfacet = use_facet < numpunct<char> > (mylocale);
myvar = myfacet.decimal_point();

每個刻面
  • 都派生自類 locale::facet(或從其派生的任何類,如另一個刻面)。
  • 定義一個名為 id 的靜態成員,型別為 locale::id,具有特定值。
程式可以透過滿足上述要求來定義自己的刻面並新增到本地化環境中。

所有刻面建構函式的第二個引數(在本參考中稱為 refs)定義了類的記憶體釋放是否委託給本地化引擎,因此當包含它的最後一個 locale 物件被銷燬時,它會自動被刪除,還是由程式在某個時刻負責刪除它。

一些刻面有一個以 "_byname" 結尾的等價物。當構造一個命名的 locale 物件時,本地化引擎會使用這些刻面型別來構造適當的刻面對象。

所有標準刻面的設計都是透過公共成員呼叫同名但以 "do_" 開頭的虛保護成員。操作本身的實現位於虛保護成員函式中(以便派生類可以輕鬆覆蓋它),而非虛公共函式則可以實現與操作本身無關但對於使該功能在系統上正常工作所必需的平臺特定功能。

所有庫實現至少預設提供所有刻面,其中 charwchar_t 型別作為刻面字元型別的模板引數。
所有庫實現至少預設提供所有刻面,其中 charwchar_t 型別作為刻面字元型別的模板引數。此外,codecvt 刻面還需要支援 char16_tchar32_t

函式

刻面管理:

便捷介面cctype 函式的模板版本)


標準刻面:

標準刻面的基類(定義成員型別):