std::ctype<CharT>::narrow, do_narrow
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <locale> で定義
|
||
public: char narrow( CharT c, char dflt ) const; |
(1) | |
public: const CharT* narrow( const CharT* beg, const CharT* end, char dflt, char* dst ) const; |
(2) | |
protected: virtual char do_narrow( CharT c, char dflt ) const; |
(3) | |
protected: virtual const CharT* do_narrow( const CharT* beg, const CharT* end, char dflt, char* dst ) const; |
(4) | |
1,2) public メンバ関数。 最も派生したクラスの protected virtual メンバ関数
do_narrow を呼びます。3) その文字がシングルバイトで表現可能であれば (例えば UTF-8 の ASCII 文字はシングルバイトです)、文字
c (ワイド文字かもしれない) をマルチバイト表現に変換します。 そのような変換が存在しない場合は dflt を返します。4) 文字配列
[beg, end) 内のすべての文字について、 dst の指す文字配列内の連続する位置にナロー化した文字 (またはナロー化が失敗したときは dflt) を書き込みます。ナロー化は、基本ソース文字集合 (C++ のプログラムを書くために必要なラテン文字、数字、句読点) のすべての文字について、常に成功し、常に (widen() を呼ぶことによって) 逆変換可能です。
成功した場合、ナロー化は is() に既知なすべての文字分類カテゴリを維持します。
数字の文字のナロー化は、その結果から文字リテラル '0' を引いたとき、その差が元の文字の数字の値と等しくなることを保証します。
引数
| c | - | 変換する文字 |
| dflt | - | 変換が失敗した場合に生成されるデフォルト値 |
| beg | - | 変換する文字の配列の最初の文字へのポインタ |
| end | - | 変換する文字の配列の最後の次へのポインタ |
| dst | - | 埋める文字の配列の最初の要素へのポインタ |
戻り値
1,3) ナロー化した文字、またはナロー化に失敗した場合は
dflt。2,4)
end。例
Run this code
#include <locale>
#include <iostream>
void try_narrow(const std::ctype<wchar_t>& f, wchar_t c)
{
char n = f.narrow(c, 0);
if (n) {
std::wcout << '\'' << c << "' narrowed to " << +(unsigned char)n << '\n';
} else {
std::wcout << '\'' << c << "' could not be narrowed\n";
}
}
int main()
{
std::locale::global(std::locale("en_US.utf8"));
std::wcout.imbue(std::locale());
std::wcout << std::hex << std::showbase << "In US English UTF-8 locale:\n";
auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
try_narrow(f, L'A');
try_narrow(f, L'A');
try_narrow(f, L'ě');
std::locale::global(std::locale("cs_CZ.iso88592"));
auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale());
std::wcout << "In Czech ISO-8859-2 locale:\n";
try_narrow(f2, L'A');
try_narrow(f2, L'A');
try_narrow(f2, L'ě');
}
出力:
In US English UTF-8 locale:
'A' narrowed to 0x41
'A' could not be narrowed
'ě' could not be narrowed
In Czech ISO-8859-2 locale:
'A' narrowed to 0x41
'A' could not be narrowed
'ě' narrowed to 0xec
関連項目
do_widen を呼びます (パブリックメンバ関数) | |
| 文字をナロー化します ( std::basic_ios<CharT,Traits>のパブリックメンバ関数)
| |
| 可能であればワイド文字をシングルバイト文字に変換します (関数) |