std::codecvt_utf16
| ヘッダー <codecvt> で定義 |
||
| template< class Elem, |
(C++11以降) (C++17で非推奨) (C++26で削除) |
|
std::codecvt_utf16 は、UTF-16エンコードされたバイト文字列と、UCS-2またはUTF-32文字文字列(Elemの型に依存)間の変換をカプセル化する std::codecvt ファセットです。この 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 型の定数 |
[編集] メンバ関数
| (コンストラクタ) |
新しいcodecvt_utf16ファセットを構築します(public member function) |
| (デストラクタ) |
codecvt_utf16ファセットを破棄します(public member function) |
std::codecvt_utf16::codecvt_utf16
| explicit codecvt_utf16( std::size_t refs = 0 ); |
||
新しいstd::codefmt_utf16ファセットを構築し、初期参照カウンタrefsを基底クラスに渡します。
パラメータ
| refs | - | ファセットを参照する参照の数 |
std::codecvt_utf16::~codecvt_utf16
| ~codecvt_utf16(); |
||
ファセットを破棄します。ロケール管理ファセットとは異なり、このファセットのデストラクタは 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から削除されました。
[編集] 例
以下の例は、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> |
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-8とUCS-2/UCS-4の間で変換を行う (クラステンプレート) |
| (C++11)(C++17で非推奨)(C++26で削除) |
UTF-8とUTF-16の間で変換を行う (クラステンプレート) |