名前空間
変種
操作

std::codecvt_byname

From cppreference.com
< cpp‎ | locale
 
 
 
 
ヘッダー <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 メンバ関数) [編集]
ファセットが、すべての有効な引数値に対して恒等変換をエンコードするかどうかをテストします。
(std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) [編集]
[virtual]
指定された InternT バッファへの変換によって消費される ExternT 文字列の長さを計算します。
(std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) [編集]
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を含む文字エンコーディング間の変換を行う
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)