std:: codecvt_utf16
|
定義済みヘッダー
<codecvt>
|
||
|
template
<
class
Elem,
|
(C++11以降)
(C++17で非推奨) (C++26で削除) |
|
std::codecvt_utf16
は、
std::codecvt
ファセットであり、UTF-16でエンコードされたバイト文字列とUCS-2またはUTF-32文字列(
Elem
の型に依存)との間の変換をカプセル化します。この
std::codecvt
ファセットは、バイナリモードでUTF-16ファイルの読み書きに使用できます。
UCS-2はUTF-16のサブセットである旧式のエンコーディングであり、U+0000-U+FFFF(基本多言語面)の範囲のスカラー値のみを符号化します。
目次 |
テンプレートパラメータ
| Elem | - | 以下のいずれか char16_t , char32_t , または wchar_t |
| Maxcode | - |
このファセットがエラーなく読み書きできる
Elem
の最大値
|
| Mode | - | std::codecvt_mode 型の定数 |
メンバー関数
|
(constructor)
|
新しい
codecvt_utf16
ファセットを構築する
(public member function) |
|
(destructor)
|
codecvt_utf16
ファセットを破棄する
(public member function) |
std::codecvt_utf16:: codecvt_utf16
|
explicit
codecvt_utf16
(
std::
size_t
refs
=
0
)
;
|
||
新しい
std::codecvt_utf16
ファセットを構築し、初期参照カウンタ
refs
を基底クラスに渡します。
パラメータ
| refs | - | ファセットにリンクする参照数 |
std::codecvt_utf16:: ~codecvt_utf16
|
~codecvt_utf16
(
)
;
|
||
ファセットを破棄します。ロケール管理のファセットとは異なり、このファセットのデストラクタは公開されています。
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]
|
1つの
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から削除されました。
例
以下の例は、32ビット wchar_t を持つシステムでのUTF-16leファイルのデコードを示しています。16ビット wchar_t を持つシステムでは、 std :: codecvt_utf16 < char16_t > がUTF-16ではなくUCS-2を生成するため、3番目の文字のデコードは失敗します。
#include <codecvt> #include <cwchar> #include <fstream> #include <iostream> #include <locale> #include <string> void prepare_file() { // UTF-16le data (if host system is little-endian) char16_t utf16le[4] = {0x007a, // latin small letter 'z' U+007a 0x6c34, // CJK ideograph "water" U+6c34 0xd834, 0xdd0b}; // musical sign segno U+1d10b // store in a file std::ofstream fout("text.txt"); fout.write(reinterpret_cast<char*>(utf16le), sizeof utf16le); } int main() { prepare_file(); // open as a byte stream std::wifstream fin("text.txt", std::ios::binary); // apply facet fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>)); wchar_t c = 0; for (std::cout << std::showbase << std::hex; fin.get(c); std::cout << static_cast<std::wint_t>(c) << '\n'); }
出力:
0x7a 0x6c34 0x1d10b
不具合報告
以下の動作変更の欠陥報告書は、以前に公開された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-8とUCS-2/UCS-4間の変換
(クラステンプレート) |
|
(C++11)
(C++17で非推奨)
(C++26で削除)
|
UTF-8とUTF-16間の変換
(クラステンプレート) |