std::codecvt_utf8
| ヘッダー <codecvt> で定義 |
||
| template< class Elem, |
(C++11以降) (C++17で非推奨) (C++26で削除) |
|
std::codecvt_utf8 は、UTF-8 エンコーディングされたバイト文字列と、UCS-2 または UTF-32 の文字文字列(Elem の型による)との間の変換をカプセル化する std::codecvt ファセットです。この std::codecvt ファセットは、テキストおよびバイナリの両方の UTF-8 ファイルの読み書きに使用できます。
UCS-2 は、UTF-16 のサブセットである古いエンコーディングであり、U+0000-U+FFFF(基本多言語面)の範囲のスカラ値をエンコードするだけです。
目次 |
[編集] テンプレートパラメータ
| Elem | - | char16_t、char32_t、または wchar_t のいずれか |
| Maxcode | - | このファセットがエラーなしで読み書きする Elem の最大値 |
| Mode | - | std::codecvt_mode 型の定数 |
[編集] メンバ関数
| (コンストラクタ) |
新しい codecvt_utf8 ファセットを構築します。(public member function) |
| (デストラクタ) |
codecvt_utf8 ファセットを破棄します。(public member function) |
std::codecvt_utf8::codecvt_utf8
| explicit codecvt_utf8( std::size_t refs = 0 ); |
||
新しい std::codecvt_utf8 ファセットを構築します。初期参照カウンタ refs を基底クラスに渡します。
パラメータ
| refs | - | ファセットを参照する参照の数 |
std::codecvt_utf8::~codecvt_utf8
| ~codecvt_utf8(); |
||
ファセットを破棄します。ロケール管理ファセットとは異なり、このファセットのデストラクタは public です。
std::codecvt から継承
ネストされた型
| 型 | 定義 |
intern_type
|
internT
|
extern_type
|
externT
|
state_type
|
stateT
|
[編集] データメンバ
| メンバ | 説明 |
std::locale::id id [static] |
ファセットの識別子 |
メンバ関数
do_out を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_in を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_unshift を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_encoding を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_always_noconv を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_length を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) | |
do_max_length を呼び出します。( std::codecvt<InternT,ExternT,StateT> の public メンバ関数) |
Protected member functions
| [virtual] |
ファイルへの書き込み時など、InternT から ExternT への文字列を変換します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
ファイルからの読み込み時など、ExternT から InternT への文字列を変換します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
不完全な変換のための ExternT 文字の終端文字シーケンスを生成します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
定数である場合、1つの InternT 文字を生成するために必要な ExternT 文字の数を返します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
ファセットが、すべての有効な引数値に対して恒等変換をエンコードするかどうかをテストします。 ( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
指定された InternT バッファへの変換によって消費される ExternT 文字列の長さを計算します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| [virtual] |
1つの InternT 文字に変換できる ExternT 文字の最大数を返します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
std::codecvt_base から継承
| ネストされた型 | 定義 |
| enum result { ok, partial, error, noconv }; | スコープなし列挙型 |
| 列挙定数 | 定義 |
ok
|
エラーなしで変換が完了しました |
部分的
|
ソース文字のすべてが変換されたわけではありません |
error
|
無効な文字が見つかりました |
noconv
|
変換は不要、入力と出力の型は同じです |
[編集] 注記
標準では、Elem のサイズが 16 ビットの場合にこのファセットが UCS-2 と連携することが要求されていますが、一部の実装では UTF-16 が使用されています。「UCS-2」という用語は非推奨となり、ISO 10646 から削除されました。
[編集] 例
以下の例は、UCS-2/UTF-8 と UTF-16/UTF-8 の変換の違いを示しています。文字列の 3 番目の文字は有効な UCS-2 文字ではありません。
#include <codecvt> #include <cstdint> #include <iostream> #include <locale> #include <string> int main() { // UTF-8 data. The character U+1d10b, musical sign segno, does not fit in UCS-2 std::string utf8 = "z\u6c34\U0001d10b"; // the UTF-8 / UTF-16 standard conversion facet std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv; std::u16string utf16 = utf16conv.from_bytes(utf8); std::cout << "UTF-16 conversion produced " << utf16.size() << " code units:\n" << std::showbase << std::hex; for (char16_t c : utf16) std::cout << static_cast<std::uint16_t>(c) << ' '; // the UTF-8 / UCS-2 standard conversion facet std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv; try { std::u16string ucs2 = ucs2conv.from_bytes(utf8); } catch(const std::range_error& e) { std::u16string ucs2 = ucs2conv.from_bytes(utf8.substr(0, ucs2conv.converted())); std::cout << "\nUCS-2 failed after producing " << std::dec << ucs2.size() << " characters:\n" << std::showbase << std::hex; for (char16_t c : ucs2) std::cout << static_cast<std::uint16_t>(c) << ' '; std::cout << '\n'; } }
出力
UTF-16 conversion produced 4 code units: 0x7a 0x6c34 0xd834 0xdd0b UCS-2 failed after producing 2 characters: 0x7a 0x6c34
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2229 | C++98 | コンストラクタとデストラクタが指定されていなかった。 | それらを指定する。 |
[編集] 関連項目
| 文字 変換を適用できる |
ロケール定義のマルチバイト (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> |
| UTF-8、UTF-16、UTF-32を含む文字エンコーディング間の変換を行う (クラステンプレート) | |
| (C++11)(C++17で非推奨)(C++26で削除) |
標準のcodecvtファセットの動作を変更するためのタグ (enum) |
| (C++11)(C++17で非推奨)(C++26で削除) |
UTF-16とUCS-2/UCS-4の間で変換を行う (クラステンプレート) |
| (C++11)(C++17で非推奨)(C++26で削除) |
UTF-8とUTF-16の間で変換を行う (クラステンプレート) |