名前空間
変種
操作

std::codecvt

From cppreference.com
< cpp‎ | locale
 
 
 
 
 
ヘッダー <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 basecpp/locale/locale/facetstd-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] ファセットの識別子

[編集] メンバ関数

新しいcodecvtファセットを構築します
(public member function)
do_out を呼び出します。
(public メンバ関数) [編集]
do_in を呼び出します。
(public メンバ関数) [編集]
do_unshift を呼び出します。
(public メンバ関数) [編集]
do_encoding を呼び出します。
(public メンバ関数) [編集]
do_always_noconv を呼び出します。
(public メンバ関数) [編集]
do_length を呼び出します。
(public メンバ関数) [編集]
do_max_length を呼び出します。
(public メンバ関数) [編集]

[編集] 保護されたメンバ関数

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

std::codecvt_base から継承

ネストされた型 定義
enum result { ok, partial, error, noconv }; スコープなし列挙型
列挙定数 定義
ok エラーなしで変換が完了しました
部分的 ソース文字のすべてが変換されたわけではありません
error 無効な文字が見つかりました
noconv 変換は不要、入力と出力の型は同じです

[編集]

以下の例では、UTF-8変換をcodecvt<wchar_t, char, std::mbstate_t>で実装するロケールを使用してUTF-8ファイルを読み込み、`std::codecvt`の標準特殊化の1つを使用して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>

N/A
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の間で変換を行う
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)