名前空間
変種
操作

std::codecvt_byname

提供: 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 ファセットです。

4つの特殊化が標準ライブラリによって提供されます。

ヘッダ <locale> で定義
std::codecvt_byname<char, char, std::mbstate_t> 恒等変換
std::codecvt_byname<char16_t, char, std::mbstate_t> UTF-16 と UTF-8 の間の変換 (C++11以上)(C++20で非推奨)
std::codecvt_byname<char16_t, char8_t, std::mbstate_t> UTF-16 と UTF-8 の間の変換 (C++20以上)
std::codecvt_byname<char32_t, char, std::mbstate_t> UTF-32 と UTF-8 の間の変換 (C++11以上)(C++20で非推奨)
std::codecvt_byname<char32_t, char8_t, std::mbstate_t> UTF-32 と UTF-8 の間の変換 (C++20以上)
std::codecvt_byname<wchar_t, char, std::mbstate_t> ワイド文字列とナロー文字集合の間のロケール固有の変換

目次

[編集] メンバ関数

コンストラクタ
新しい codecvt_byname ファセットを構築します
(パブリックメンバ関数) [edit]
デストラクタ
codecvt_byname ファセットを破棄します
(プロテクテッドメンバ関数) [edit]

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

メンバオブジェクト

メンバ名
id (static) std::locale::id

メンバ関数

do_out を呼びます
(std::codecvtのパブリックメンバ関数) [edit]
do_in を呼びます
(std::codecvtのパブリックメンバ関数) [edit]
do_unshift を呼びます
(std::codecvtのパブリックメンバ関数) [edit]
do_encoding を呼びます
(std::codecvtのパブリックメンバ関数) [edit]
do_always_noconv を呼びます
(std::codecvtのパブリックメンバ関数) [edit]
do_length を呼びます
(std::codecvtのパブリックメンバ関数) [edit]
do_max_length を呼びます
(std::codecvtのパブリックメンバ関数) [edit]

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

[仮想]
ファイルを書き込む時などのために、文字列を internT から externT に変換します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]
[仮想]
ファイルから読み込む時などのために、文字列を externT から internT に変換します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]
[仮想]
不完全な変換に対する externT 文字の終了文字シーケンスを生成します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]
[仮想]
一定であれば、ひとつの internT 文字を生成するのに必要な externT の文字数を返します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]
ファセットがすべての有効な引数の値に対して恒等変換をエンコードするかどうか調べます
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]
[仮想]
与えられた internT バッファへの変換によって消費されるであろう externT 文字列の長さを計算します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]
単一の internT 文字に変換される可能性のある externT の最大文字数を返します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]


std::codecvt_base から継承

メンバ型 定義
enum result { ok, partial, error, noconv }; スコープなし列挙型
列挙定数 定義
ok 変換はエラーなしで完了しました
partial 変換元の文字は全部は変換されませんでした
error 無効な文字に遭遇しました
noconv 変換は必要ありません、入力と出力の型は同じです

[編集]

この例は GB18030 対応ロケールの codecvt ファセットを用いた GB18030 エンコードされたファイルの読み込みをデモンストレーションします。

#include <iostream>
#include <fstream>
#include <string>
#include <locale>
 
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 << c << '\n';
}

出力:

0x7a
0xdf
0x6c34
0x1d10b

[編集] 関連項目

UTF-8, UTF-16, UTF-32 を含む文字エンコーディング間の変換を行います
(クラステンプレート) [edit]