Namespaces
Variants

std:: codecvt_byname

From cppreference.net
ヘッダーで定義 <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 > ロケール固有のワイド文字列とナロー文字セット間の変換

メンバー関数

(constructor)
新しい codecvt_byname ファセットを構築する
(public member function)
(destructor)
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> の公開メンバ関数)
do_in を呼び出す
( std::codecvt<InternT,ExternT,StateT> の公開メンバ関数)
do_unshift を呼び出す
( std::codecvt<InternT,ExternT,StateT> の公開メンバ関数)
do_encoding を呼び出す
( std::codecvt<InternT,ExternT,StateT> の公開メンバ関数)
do_always_noconv を呼び出す
( std::codecvt<InternT,ExternT,StateT> の公開メンバ関数)
do_length を呼び出す
( std::codecvt<InternT,ExternT,StateT> の公開メンバ関数)
do_max_length を呼び出す
( std::codecvt<InternT,ExternT,StateT> の公開メンバ関数)

プロテクテッドメンバー関数

[virtual]
InternT から ExternT への文字列変換を実行する(ファイル書き込み時など)
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)
[virtual]
ExternT から InternT への文字列変換を実行する(ファイル読み込み時など)
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)
[virtual]
不完全な変換に対する ExternT 文字の終端文字シーケンスを生成する
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)
[virtual]
1つの InternT 文字を生成するために必要な ExternT 文字数を返す(定数の場合)
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)
全ての有効な引数値に対して恒等変換をエンコードするかどうかをテストする
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)
[virtual]
指定された InternT バッファへの変換によって消費される ExternT 文字列の長さを計算する
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)
[virtual]
単一の InternT 文字に変換される可能性のある最大の ExternT 文字数を返す
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)

std::codecvt_base から継承

ネスト型 定義
enum result { ok, partial, error, noconv } ; 非スコープ列挙型
列挙定数 定義
ok エラーなく変換が完了した
partial すべてのソース文字が変換されなかった
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を含む)
(クラステンプレート)