std:: codecvt_utf8
|
ヘッダーで定義
<codecvt>
|
||
|
template
<
class
Elem,
|
(C++11 以降)
(C++17 で非推奨) (C++26 で削除) |
|
std::codecvt_utf8
は、
std::codecvt
ファセットであり、UTF-8でエンコードされたバイト文字列とUCS-2またはUTF-32文字列(
Elem
の型に依存)との間の変換をカプセル化します。この
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 型の定数 |
メンバー関数
|
(constructor)
|
新しい
codecvt_utf8
ファセットを構築する
(public member function) |
|
(destructor)
|
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
(
)
;
|
||
ファセットを破棄します。ロケール管理のファセットとは異なり、このファセットのデストラクタは公開されています。
std:: codecvt から継承
ネストされた型
| 型 | 定義 |
intern_type
|
internT
|
extern_type
|
externT
|
state_type
|
stateT
|
データメンバ
| メンバー | 説明 |
std::locale::id
id
[static]
|
ファセット の識別子 |
メンバー関数
do_out
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
|
do_in
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
|
do_unshift
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
|
do_encoding
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
|
do_always_noconv
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
|
do_length
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
|
do_max_length
を呼び出す
(
std::codecvt<InternT,ExternT,StateT>
の
公開メンバ関数)
|
プロテクテッドメンバー関数
|
[virtual]
|
InternT
から
ExternT
への文字列変換を実行する(ファイル書き込み時など)
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
|
[virtual]
|
ExternT
から
InternT
への文字列変換を実行する(ファイル読み込み時など)
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
|
[virtual]
|
不完全な変換に対する
ExternT
文字の終端文字シーケンスを生成する
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
|
[virtual]
|
1つの
InternT
文字を生成するために必要な
ExternT
文字数を返す(定数の場合)
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
|
[virtual]
|
全ての有効な引数値に対して恒等変換をエンコードするかどうかをテストする
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
|
[virtual]
|
指定された
InternT
バッファへの変換によって消費される
ExternT
文字列の長さを計算する
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
|
[virtual]
|
単一の
InternT
文字に変換される可能性のある最大の
ExternT
文字数を返す
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
std::codecvt_base から継承
| ネスト型 | 定義 |
| enum result { ok, partial, error, noconv } ; | スコープなし列挙型 |
| 列挙定数 | 定義 |
ok
|
エラーなく変換が完了した |
partial
|
すべてのソース文字が変換されなかった |
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
>
|
該当なし |
| 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ファセットの動作を変更するためのタグ
(列挙型) |
|
(C++11)
(C++17で非推奨)
(C++26で削除)
|
UTF-16とUCS-2/UCS-4間の変換
(クラステンプレート) |
|
(C++11)
(C++17で非推奨)
(C++26で削除)
|
UTF-8とUTF-16間の変換
(クラステンプレート) |