std::ctype<CharT>::widen, do_widen
来自cppreference.com
定义于头文件 <locale>
|
||
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++23 前)基础字符集 (C++23 前)的字符拥有唯一良好定义的加宽变换,它也保证是可逆的(通过 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 << "单字节字符 " << +(unsigned char)c << " 加宽为 " << +w << '\n'; } int main() { std::locale::global(std::locale("cs_CZ.iso88592")); auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale()); std::cout << std::hex << std::showbase << "在 Czech ISO-8859-2 区域设置下:\n"; 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("cs_CZ.utf8")); auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale()); std::cout << "在 Czech UTF-8 区域设置下:\n"; try_widen(f2, 'a'); try_widen(f2, '\xdf'); try_widen(f2, '\xec'); }
输出:
在 Czech ISO-8859-2 区域设置下: 单字节字符 0x61 加宽为 to 0x61 单字节字符 0xdf 加宽为 to 0xdf 单字节字符 0xec 加宽为 to 0x11b 在 Czech UTF-8 区域设置下: 单字节字符 0x61 加宽为 to 0x61 单字节字符 0xdf 加宽为 to 0xffffffff 单字节字符 0xec 加宽为 to 0xffffffff
参阅
调用 do_narrow (公开成员函数) | |
拓宽字符 ( std::basic_ios<CharT,Traits> 的公开成员函数) | |
若可能,则加宽单字节窄字符为宽字符 (函数) |