std::codecvt_byname
From cppreference.com
| ヘッダー <locale> で定義 |
||
| template< class InternT, class ExternT, class State > class codecvt_byname : public std::codecvt<InternT, ExternT, State>; |
||
std::codecvt_byname は、コンストラクタで指定されたロケールのマルチバイト/ワイド文字変換規則をカプセル化する std::codecvt ファセットです。
目次 |
[編集] 特殊化
標準ライブラリは、以下の特殊化を提供することが保証されています。
| ヘッダー
<locale> で定義 | |
| std::codecvt_byname<char, char, std::mbstate_t> | 同一変換 |
| std::codecvt_byname<char16_t, char, std::mbstate_t> (C++11以降)(C++20で非推奨) |
UTF-16 と UTF-8 の間の変換 |
| std::codecvt_byname<char16_t, char8_t, std::mbstate_t> (C++20以降) |
UTF-16 と UTF-8 の間の変換 |
| std::codecvt_byname<char32_t, char, std::mbstate_t> (C++11以降)(C++20で非推奨) |
UTF-32 と UTF-8 の間の変換 |
| std::codecvt_byname<char32_t, char8_t, std::mbstate_t> (C++20以降) |
UTF-32 と UTF-8 の間の変換 |
| std::codecvt_byname<wchar_t, char, std::mbstate_t> | ロケール固有のワイド文字列とナロー文字セット間の変換 |
[編集] メンバ関数
| (コンストラクタ) |
新しい codecvt_byname ファセットを構築します。(public member function) |
| (デストラクタ) |
codecvt_byname ファセットを破棄します。(protected member function) |
std::codecvt_byname::codecvt_byname
| explicit codecvt_byname( const char* name, std::size_t refs = 0 ); |
||
| explicit codecvt_byname( const std::string& name, std::size_t refs = 0 ); |
(C++11以降) | |
name で指定されたロケールの新しい std::codecvt_byname ファセットを構築します。
refs はリソース管理に使用されます。 refs == 0 の場合、それを持つ最後の std::locale オブジェクトが破棄されるときに、実装はファセットを破棄します。それ以外の場合、オブジェクトは破棄されません。
パラメータ
| name | - | ロケールの名前 |
| refs | - | ファセットを参照する参照の数 |
std::codecvt_byname::~codecvt_byname
| protected: ~codecvt_byname(); |
||
ファセットを破棄します。
std::codecvt から継承
ネストされた型
| 型 | 定義 |
intern_type
|
internT
|
extern_type
|
externT
|
state_type
|
stateT
|
[編集] データメンバ
| メンバ | 説明 |
std::locale::id id [static] |
ファセットの識別子 |
メンバ関数
do_out を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_in を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_unshift を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_encoding を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_always_noconv を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_length を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_max_length を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) |
Protected member functions
| [virtual] |
ファイルへの書き込み時など、InternT から ExternT への文字列を変換します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
ファイルからの読み込み時など、ExternT から InternT への文字列を変換します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
不完全な変換のための ExternT 文字の終端文字シーケンスを生成します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
定数である場合、1つの InternT 文字を生成するために必要な ExternT 文字の数を返します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
ファセットが、すべての有効な引数値に対して恒等変換をエンコードするかどうかをテストします。 ( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
指定された InternT バッファへの変換によって消費される ExternT 文字列の長さを計算します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
1つの InternT 文字に変換できる ExternT 文字の最大数を返します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
std::codecvt_base から継承
| ネストされた型 | 定義 |
| enum result { ok, partial, error, noconv }; | スコープなし列挙型 |
| 列挙定数 | 定義 |
ok
|
エラーなしで変換が完了しました |
部分的
|
ソース文字のすべてが変換されたわけではありません |
error
|
無効な文字が見つかりました |
noconv
|
変換は不要、入力と出力の型は同じです |
[編集] 例
この例は、GB18030 対応ロケールから取得した codecvt ファセットを使用して、GB18030 エンコーディングされたファイルを読み込む方法を示しています。
このコードを実行
#include <fstream> #include <iostream> #include <locale> #include <string> int main() { // GB18030 narrow multibyte encoding std::ofstream("text.txt") << "\x7a" // letter 'z', U+007a "\x81\x30\x89\x38" // letter 'ß', U+00df "\xcb\xae" // CJK ideogram '水' (water), U+6c34 "\x94\x32\xbc\x35"; // musical sign '𝄋' (segno), U+1d10b std::wifstream fin("text.txt"); fin.imbue(std::locale(fin.getloc(), new std::codecvt_byname<wchar_t, char, std::mbstate_t>("zh_CN.gb18030"))); for (wchar_t c; fin.get(c);) std::cout << std::hex << std::showbase << static_cast<unsigned>(c) << '\n'; }
実行結果の例
0x7a 0xdf 0x6c34 0x1d10b
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 21 | C++98 | 標準ライブラリは、std::codecvt_byname の特殊化を一切提供する必要はありませんでした。 |
2 つの特殊化が必要です。 |
[編集] 関連項目
| UTF-8、UTF-16、UTF-32を含む文字エンコーディング間の変換を行う (クラステンプレート) |