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]
|
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]
|
ファセットが全ての有効な引数値に対して恒等変換をエンコードするかどうかをテストする
(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
>
|
該当なし |
| 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の間で変換する
(クラステンプレート) |