Namespaces
Variants

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

From cppreference.net
ヘッダーで定義 <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) 公開メンバ関数。対応するprotected仮想メンバ関数 do_widen の最も派生したクラスのオーバーロードを呼び出す。オーバーロード(1)は do_widen ( c ) を、オーバーロード(2)は do_widen ( beg, end, dst ) を呼び出す。
3) 単一バイト文字 c を、最も単純かつ妥当な変換を用いて対応するワイド文字表現に変換します。通常、これはマルチバイトエンコーディングが単一バイトである文字(例:UTF-8におけるU+0000-U+007F)にのみ適用されます。
4) 文字配列 [ beg , end ) 内の各文字について、対応するワイド文字を dst が指す文字配列の連続する位置に書き込みます。

ワイド化は常にワイド文字を返しますが、一意で明確に定義されたワイド化変換が保証され、かつ( narrow() によって)可逆性が保証されているのは、 基本ソース文字セット (C++23まで) 基本文字セット (C++23以降) からの文字のみです。実際には、マルチバイト表現が単一バイトであるすべての文字は通常、対応するワイド文字にワイド化され、残りの可能な単一バイト値は通常、同じプレースホルダー値(一般的に CharT ( - 1 ) )にマッピングされます。

拡張が成功した場合、 is() が認識するすべての文字分類カテゴリが保持されます。

目次

パラメータ

c - 変換する文字
dflt - 変換失敗時に返すデフォルト値
beg - 変換対象の文字配列の先頭文字へのポインタ
end - 変換対象の文字配列の終端次ポインタ
dst - 格納先文字配列の先頭要素へのポインタ

戻り値

1,3) 拡張文字。
2,4) end

#include <iostream>
#include <locale>
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 << '\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 << "In Czech ISO-8859-2 locale:\n";
    try_widen(f, 'a');
    try_widen(f, '\xdf'); // German letter ß (U+00df) in ISO-8859-2
    try_widen(f, '\xec'); // Czech letter ě (U+011b) in ISO-8859-2
    std::locale::global(std::locale("cs_CZ.utf8"));
    auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale());
    std::cout << "In Czech UTF-8 locale:\n";
    try_widen(f2, 'a');
    try_widen(f2, '\xdf'); 
    try_widen(f2, '\xec'); 
}

出力例:

In Czech ISO-8859-2 locale:
The single-byte character 0x61 widens to 0x61
The single-byte character 0xdf widens to 0xdf
The single-byte character 0xec widens to 0x11b
In Czech UTF-8 locale:
The single-byte character 0x61 widens to 0x61
The single-byte character 0xdf widens to 0xffffffff
The single-byte character 0xec widens to 0xffffffff

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 153 C++98 widen は常にオーバーロード (4) を呼び出していた 対応するオーバーロードを呼び出す

関連項目

do_narrow を呼び出す
(公開メンバ関数)
文字をワイド文字に変換する
( std::basic_ios<CharT,Traits> の公開メンバ関数)
可能であれば、単一バイトのナロー文字をワイド文字に変換する
(関数)