Namespaces
Variants

std:: codecvt

From cppreference.net
ヘッダーで定義 <locale>
template <

class InternT,
class ExternT,
class StateT

> class codecvt ;

クラステンプレート std::codecvt は、ワイド文字列とマルチバイト文字列を含む文字列の、あるエンコーディングから別のエンコーディングへの変換をカプセル化します。 std:: basic_fstream < CharT > を通じて実行されるすべてのファイルI/O操作は、ストリームに組み込まれたロケールの std :: codecvt < CharT, char , std:: mbstate_t > ファセットを使用します。

cpp/locale/codecvt base cpp/locale/locale/facet std-codecvt-inheritance.svg

継承図

目次

特殊化

標準ライブラリは以下の特殊化を提供することが保証されています(これらは あらゆるロケールオブジェクトで実装が必須 とされています):

ヘッダーで定義 <locale>
std :: codecvt < char , char , std:: mbstate_t > 同一変換
std :: codecvt < char16_t , char , std:: mbstate_t >
(C++11以降) (C++20で非推奨)
UTF-16とUTF-8間の変換
std :: codecvt < char16_t , char8_t, std:: mbstate_t >
(C++20以降) (非推奨)
UTF-16とUTF-8間の変換
std :: codecvt < char32_t , char , std:: mbstate_t >
(C++11以降) (C++20で非推奨)
UTF-32とUTF-8間の変換
std :: codecvt < char32_t , char8_t, std:: mbstate_t >
(C++20以降) (非推奨)
UTF-32とUTF-8間の変換
std :: codecvt < wchar_t , char , std:: mbstate_t > システムのネイティブワイド文字セットとシングルバイトナロー文字セット間の変換

ネスト型

定義
intern_type InternT
extern_type ExternT
state_type StateT

データメンバ

メンバー 説明
std::locale::id id [static] facet の識別子

メンバー関数

新しい codecvt ファセットを構築する
(public member function)
do_out を呼び出す
(public member function)
do_in を呼び出す
(public member function)
do_unshift を呼び出す
(public member function)
do_encoding を呼び出す
(public member function)
do_always_noconv を呼び出す
(public member function)
do_length を呼び出す
(public member function)
do_max_length を呼び出す
(public member function)

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

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

std::codecvt_base から継承

ネスト型 定義
enum result { ok, partial, error, noconv } ; 非スコープ列挙型
列挙定数 定義
ok エラーなく変換が完了した
partial すべてのソース文字が変換されなかった
error 無効な文字に遭遇した
noconv 変換不要、入力型と出力型が同一

以下の例は、UTF-8変換を実装するロケールを使用してUTF-8ファイルを読み込み、 codecvt < wchar_t , char , std:: mbstate_t > を使用し、標準の特殊化の一つである std::codecvt を使用してUTF-8文字列をUTF-16に変換します。

#include <codecvt>
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
    template<class... Args>
    deletable_facet(Args&&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
int main()
{
    // UTF-8 narrow multibyte encoding
    std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");
                       // or reinterpret_cast<const char*>(+u8"zß水🍌")
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
    std::ofstream("text.txt") << data;
    // using system-supplied locale's codecvt facet
    std::wifstream fin("text.txt");
    // reading from wifstream will use codecvt<wchar_t, char, std::mbstate_t>
    // this locale's codecvt converts UTF-8 to UCS4 (on systems such as Linux)
    fin.imbue(std::locale("en_US.UTF-8"));
    std::cout << "The UTF-8 file contains the following UCS4 code units:\n" << std::hex;
    for (wchar_t c; fin >> c;)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint32_t>(c) << ' ';
    // using standard (locale-independent) codecvt facet
    std::wstring_convert<
        deletable_facet<std::codecvt<char16_t, char, std::mbstate_t>>, char16_t> conv16;
    std::u16string str16 = conv16.from_bytes(data);
    std::cout << "\n\nThe UTF-8 file contains the following UTF-16 code units:\n"
              << std::hex;
    for (char16_t c : str16)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint16_t>(c) << ' ';
    std::cout << '\n';
}

出力:

The UTF-8 file contains the following UCS4 code units:
U+007a U+00df U+6c34 U+1f34c 
The UTF-8 file contains the following UTF-16 code units:
U+007a U+00df U+6c34 U+d83c U+df4c

不具合報告

以下の動作変更欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3767 C++20 std :: codecvt < char16_t , char8_t, std:: mbstate_t > および
std :: codecvt < char32_t , char8_t, std:: mbstate_t > はロケール非依存
これらを非推奨化

関連項目

文字変換
ロケール定義マルチバイト
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (C11のDR488付き)

codecvt < char16_t , char ,mbstate_t >
codecvt_utf8_utf16 < char16_t >
codecvt_utf8_utf16 < char32_t >
codecvt_utf8_utf16 < wchar_t >

該当なし
UCS-2 c16rtomb (C11のDR488なし) codecvt_utf8 < char16_t > codecvt_utf16 < char16_t >
UTF-32

mbrtoc32 / c32rtomb

codecvt < char32_t , char ,mbstate_t >
codecvt_utf8 < char32_t >

codecvt_utf16 < char32_t >

システム wchar_t :

UTF-32 (非Windows)
UCS-2 (Windows)

mbsrtowcs / wcsrtombs
use_facet < codecvt
< wchar_t , char ,mbstate_t >> ( locale )

codecvt_utf8 < wchar_t > codecvt_utf16 < wchar_t >
文字変換エラーを定義する
(クラス)
指定されたロケールに対するシステム提供の std::codecvt を表す
(クラステンプレート)
(C++11) (C++17で非推奨) (C++26で削除)
UTF-8とUCS-2/UCS-4の間で変換する
(クラステンプレート)
(C++11) (C++17で非推奨) (C++26で削除)
UTF-16とUCS-2/UCS-4の間で変換する
(クラステンプレート)
(C++11) (C++17で非推奨) (C++26で削除)
UTF-8とUTF-16の間で変換する
(クラステンプレート)