c++11 标准模板(STL)本地化库 - 平面类别 - (std::ctype) 定义字符分类表(七)

本地化库

本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。

平面类别

定义字符分类表

std::ctype

template< class CharT >
class ctype;

类 ctype 封装字符分类特征。所有通过 std::basic_istream<charT> 进行的流输入操作用感染于流中的 std::ctype<charT> 鉴别空白符以将输入记号化。流输出操作在输出前应用 std::ctype<charT>::widen() 到窄字符参数。

继承图

标准库提供二个孤立(独立于本地环境)的特化:

定义于头文件 <locale>

std::ctype<char>提供最小 "C" 本地环境分类的窄字符等价版本。此特化用表查找字符分类
std::ctype<wchar_t>提供适合于原生字符集的宽字符分类

另外, C++ 程序中构造的每个 locale 对象实现其自身(本地环境限定)的这些版本。

成员类型

成员类型定义
char_typeCharT

调用 do_widen & 将一或多个字符从 char 转换为 charT

std::ctype<CharT>::widen, 
do_widen

public:
CharT widen( char c ) const;

(1)

public:
const char* widen( const char* beg, const char* end, CharT* dst ) const;

(2)

protected:
virtual CharT do_widen( char c ) const;

(3)

protected:
virtual const char* do_widen( const char* beg, const char* end, CharT* dst ) const;

(4)

1,2) 公开成员函数,调用最终导出类的受保护虚成员函数 do_widen

3) 用最简单的合理变换,转换单字节字符 c 为对应的宽字符。这典型地仅应用于多字节编码为单字节的字符(例如 UTF-8 中的 U+0000-U+007F )。

4) 对字符数组 [beg, end) 中每个字符,写入对应的加宽字符到 dst 所指向的字符数组中的相继位置。

加宽始终返回宽字符,但只保证来自基本源字符集(拉丁字母、数字和要求以书写 C++ 程序的标点)的字符拥有唯一良好定义的加宽变换,它亦保证为可逆(以 narrow() )。实践中,所有多字节表示为单字节的字符通常都被加宽为其宽字符对应,而剩下的可能单字节值通常被映射为同一占位值,典型地为 CharT(-1) 。

若加宽有意义,则保持 is() 所知的所有字符分类类别。

参数

c-要转换的字符
dflt-若转换失败则产生的默认值
beg-指向要转换的字符数组中首字符的指针
end-指向要转换的字符数组的尾后一位置的指针
dst-指向要填充的字符数组首元素的指针

返回值

1,3) 加宽的字符

2,4) end

调用示例

#include <locale>
#include <iostream>

void try_widen(const std::ctype<wchar_t>& f, char c)
{
    wchar_t w = f.widen(c);
    std::cout << "The single-byte character " << +(unsigned char)c
              << " widens to " << +w << std::endl;
}

int main()
{
    std::locale::global(std::locale("Chinese (Simplified)_China.936"));
    auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
    std::cout << std::hex << std::showbase
              << "In Chinese (Simplified)_China.936 locale:" << std::endl;
    try_widen(f, 'a');
    try_widen(f, '\xdf'); // ISO-8859-2 中的德文字母 ß (U+00df)
    try_widen(f, '\xec'); // ISO-8859-2 中的捷克文字母 ě (U+011b)

    std::locale::global(std::locale("C"));
    auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale());
    std::cout << "In C locale:" << std::endl;
    try_widen(f2, 'a');
    try_widen(f2, '\xdf');
    try_widen(f2, '\xec');

    return 0;
}

输出

In Chinese (Simplified)_China.936 locale:
The single-byte character 0x61 widens to 0x61
The single-byte character 0xdf widens to 0xffff
The single-byte character 0xec widens to 0xffff
In C locale:
The single-byte character 0x61 widens to 0x61
The single-byte character 0xdf widens to 0xdf
The single-byte character 0xec widens to 0xec

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值