std::codecvt
| ヘッダー <locale> で定義 |
||
| template< class InternT, |
||
クラステンプレートstd::codecvtは、ワイド文字およびマルチバイト文字を含む文字列表現を、あるエンコーディングから別のエンコーディングへ変換することをカプセル化します。std::basic_fstream<CharT>を介して実行されるすべてのファイルI/O操作は、ストリームに設定されたロケールが持つstd::codecvt<CharT, char, std::mbstate_t>ファセットを使用します。
継承図
目次 |
[編集] 特殊化
標準ライブラリは、以下の特殊化を提供することが保証されています(これらは あらゆるロケールオブジェクトによって実装される必要があります)。
| ヘッダー
<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] |
ファセットが、すべての有効な引数値に対して恒等変換をエンコードするかどうかをテストします。 (virtual protected メンバ関数) |
| [virtual] |
指定された InternT バッファへの変換によって消費される ExternT 文字列の長さを計算します。(virtual protected メンバ関数) |
| [virtual] |
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> |
N/A |
| UCS-2 | c16rtomb (C11 の DR488 を使用しない場合) | codecvt_utf8<char16_t> | codecvt_utf16<char16_t> |
| UTF-32 |
codecvt<char32_t,char,mbstate_t> |
codecvt_utf16<char32_t> | |
| システム wchar_t UTF-32 (Windows 以外) |
mbsrtowcs / wcsrtombs |
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の間で変換を行う (クラステンプレート) |