本地化库
本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。
平面类别
定义字符分类表
std::ctype
template< class CharT > |
类 ctype 封装字符分类特征。所有通过 std::basic_istream<charT> 进行的流输入操作用感染于流中的 std::ctype<charT> 鉴别空白符以将输入记号化。流输出操作在输出前应用 std::ctype<charT>::widen() 到窄字符参数。
继承图
标准库提供二个孤立(独立于本地环境)的特化:
定义于头文件 | |
std::ctype<char> | 提供最小 "C" 本地环境分类的窄字符等价版本。此特化用表查找字符分类 |
std::ctype<wchar_t> | 提供适合于原生字符集的宽字符分类 |
另外, C++ 程序中构造的每个 locale 对象实现其自身(本地环境限定)的这些版本。
调用 do_is & 分类字符或字符序列
std::ctype<CharT>::is,
std::ctype<CharT>::do_is
public: | (1) | |
public: | (2) | |
protected: | (3) | |
protected: | (4) |
1,2) 公开成员函数,调用最终导出类的受保护虚成员函数 do_is
。
3) 检查字符 c
是否以掩码 m
分类。
4) 对字符数组 [low, high)
中的每个字符,鉴别完整分类掩码(例如默认本地环境中对于数字 '0' 为 digit|xdigit|alnum|print|graph ),并存储掩码于 vec
所指向数组的对应元素。
参数
c | - | 要分类的字符 |
m | - | 用于分类单个字符的掩码 |
low | - | 指向要分类的字符数组中首字符的指针 |
high | - | 要分类的字符数组的尾后一位置指针 |
vec | - | 指向要填充的掩码数组首元素的指针 |
返回值
1,3) 若 c
以 m
分类则为 true
2,4) high
调用示例
#include <locale>
#include <utility>
#include <vector>
#include <iostream>// 使绑定到 locale 的 facet 可析构的工具包装器
template<class Facet>
struct deletable_facet : Facet
{template<class ...Args>deletable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}~deletable_facet() {}
};int main()
{// 用默认 locale 分类单个字符auto& f = std::use_facet<std::ctype<char>>(std::locale());char c = '0';if (f.is(std::ctype_base::digit, c)) // 或 isdigit(c, locale());{std::cout << "'" << c << "' is a digit" << std::endl;}// 用具名 locale 分类每个字符串中的字符deletable_facet<std::ctype_byname<wchar_t>> f2("en_US.utf8");std::wstring wstring1 = L"z\u00df\u6c34\U0001d10b";std::vector<std::ctype_base::mask> vector1(wstring1.size());f2.is(&wstring1[0], &wstring1[0] + wstring1.size(), &vector1[0]);for (std::size_t n = 0; n < wstring1.size(); ++n){std::cout << std::hex << "U+" << wstring1[n] << " is: ";if (vector1[n] & std::ctype_base::alnum){std::cout << " alnum ";}if (vector1[n] & std::ctype_base::alpha){std::cout << " alpha ";}if (vector1[n] & std::ctype_base::digit){std::cout << " digit ";}if (vector1[n] & std::ctype_base::graph){std::cout << " graph ";}if (vector1[n] & std::ctype_base::cntrl){std::cout << " cntrl ";}if (vector1[n] & std::ctype_base::lower){std::cout << " lower ";}if (vector1[n] & std::ctype_base::print){std::cout << " print ";}if (vector1[n] & std::ctype_base::punct){std::cout << " punct ";}if (vector1[n] & std::ctype_base::space){std::cout << " space ";}if (vector1[n] & std::ctype_base::upper){std::cout << " upper ";}if (vector1[n] & std::ctype_base::xdigit){std::cout << " xdigit ";}if (vector1[n] & std::ctype_base::blank){std::cout << " blank ";}std::cout << std::endl;}return 0;
}
输出
'0' is a digit
U+7a is: alnum alpha graph lower print
U+df is: alnum alpha graph lower print
U+6c34 is: alnum alpha graph print
U+d834 is:
U+dd0b is: