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

来自cppreference.com
< cpp‎ | locale‎ | ctype
 
 
本地化库
本地环境与平面
本地环境
平面类别基类
ctype(字符类别)平面
numeric(数值)平面
collate(对照比较)平面
time(时间)平面
monetary(货币)平面
messages(消息)平面
字符分类与转换
字符分类
转换
编码转换平面
(C++11)    
C 本地环境
 
 
在标头 <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 的对应重载。重载 (1) 会调用 do_widen(c),重载 (2) 会调用 do_widen(beg, end, dst)
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 << "在捷克语 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 << "在捷克语 UTF-8 本地环境下:\n";
    try_widen(f2, 'a');
    try_widen(f2, '\xdf'); 
    try_widen(f2, '\xec'); 
}

输出:

在捷克语 ISO-8859-2 本地环境下:
单字节字符 0x61 加宽为 to 0x61
单字节字符 0xdf 加宽为 to 0xdf
单字节字符 0xec 加宽为 to 0x11b
在捷克语 UTF-8 本地环境下:
单字节字符 0x61 加宽为 to 0x61
单字节字符 0xdf 加宽为 to 0xffffffff
单字节字符 0xec 加宽为 to 0xffffffff

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 153 C++98 widen 只会调用重载 (4) 会调用对应重载

参阅

调用 do_narrow
(公开成员函数)
拓宽字符
(std::basic_ios<CharT,Traits> 的公开成员函数)
若可能,则加宽单字节窄字符为宽字符
(函数)