std::codecvt_utf16
ヘッダ <codecvt> で定義 | ||
template<class Elem, unsignedlong Maxcode =0x10ffff, | (C++11以上) (C++17で非推奨) | |
std::codecvt_utf16 は UTF-16 エンコードされたバイト文字列と UCS2 または UTF-32 文字列 (Elem
の型によります) の間の変換をカプセル化する std::codecvt ファセットです。 この codecvt ファセットはバイナリモードで UTF-16 ファイルを読み書きするために使用できます。
目次 |
[編集]テンプレート引数
Elem | - | char16_t、 char32_t または wchar_t のいずれか |
Maxcode | - | このファセットがエラーなしに読み書きする Elem の最も大きな値 |
Mode | - | std::codecvt_mode 型の定数 |
[編集]メンバ関数
コンストラクタ | 新しい codecvt_utf16 ファセットを構築します (パブリックメンバ関数) |
デストラクタ | codecvt_utf16 ファセットを破棄します (パブリックメンバ関数) |
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 |
メンバオブジェクト
メンバ名 | 型 |
id (static) | std::locale::id |
メンバ関数
do_out を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) | |
do_in を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) | |
do_unshift を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) | |
do_encoding を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) | |
do_always_noconv を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) | |
do_length を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) | |
do_max_length を呼びます ( std::codecvt<InternT,ExternT,State> のパブリックメンバ関数) |
プロテクテッドメンバ関数
[仮想] | ファイルを書き込む時などのために、文字列を internT から externT に変換します ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
[仮想] | ファイルから読み込む時などのために、文字列を externT から internT に変換します ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
[仮想] | 不完全な変換に対する externT 文字の終了文字シーケンスを生成します ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
[仮想] | 一定であれば、ひとつの internT 文字を生成するのに必要な externT の文字数を返します ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
[仮想] | ファセットがすべての有効な引数の値に対して恒等変換をエンコードするかどうか調べます ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
[仮想] | 与えられた internT バッファへの変換によって消費されるであろう externT 文字列の長さを計算します ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
[仮想] | 単一の internT 文字に変換される可能性のある externT の最大文字数を返します ( std::codecvt<InternT,ExternT,State> の仮想プロテクテッドメンバ関数) |
std::codecvt_base から継承
メンバ型 | 定義 |
enum result { ok, partial, error, noconv }; | スコープなし列挙型 |
列挙定数 | 定義 |
ok | 変換はエラーなしで完了しました |
partial | 変換元の文字は全部は変換されませんでした |
error | 無効な文字に遭遇しました |
noconv | 変換は必要ありません、入力と出力の型は同じです |
[編集]ノート
標準は、 Elem
のサイズが16ビットのときはこのファセットが UCS2 で動作することを要求していますが、一部の処理系は代わりに UTF-16 を使用し、これを無変換ファセットとしています。 用語「UCS2」は非推奨であり、 Unicode 標準からは削除されました。
[編集]例
以下の例は32ビット wchar_t のシステムで UTF-16LE ファイルのデコードをデモンストレーションします。 16ビット wchar_t のシステムでは、 std::codecvt_utf16<char16_t> が UTF-16 でなく UCS2 を生成するため、3文字目のデコードに失敗します。
#include <fstream>#include <iostream>#include <string>#include <locale>#include <codecvt> void prepare_file(){// UTF-16le data (if host system is little-endian)char16_t utf16le[4]={0x007a, // latin small letter 'z' U+007a0x6c34, // CJK ideograph "water" U+6c340xd834, 0xdd0b};// musical sign segno U+1d10b// store in a filestd::ofstream fout("text.txt"); fout.write(reinterpret_cast<char*>(utf16le), sizeof utf16le);} int main(){ prepare_file();// open as a byte streamstd::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>)); for(wchar_t c; fin.get(c);)std::cout<<std::showbase<<std::hex<< c <<'\n';}
出力:
0x7a 0x6c34 0x1d10b
[編集]関連項目
文字変換 | ロケール定義のマルチバイト (UTF-8, GB18030) | UTF-8 | UTF-16 |
---|---|---|---|
UTF-16 | mbrtoc16 / c16rtomb(C11のDR488あり) | codecvt<char16_t, char, mbstate_t> codecvt_utf8_utf16<char16_t> codecvt_utf8_utf16<char32_t> codecvt_utf8_utf16<wchar_t> | N/A |
UCS2 | c16rtomb(C11のDR488なし) | codecvt_utf8<char16_t> codecvt_utf8<wchar_t>(Windows) | codecvt_utf16<char16_t> codecvt_utf16<wchar_t>(Windows) |
UTF-32 | codecvt<char32_t, char, mbstate_t> | codecvt_utf16<char32_t> | |
システム全体: UTF-32(Windows以外) UCS2(Windows) | mbsrtowcs / wcsrtombs | No | No |
UTF-8, UTF-16, UTF-32 を含む文字エンコーディング間の変換を行います (クラステンプレート) | |
(C++11)(C++17で非推奨) | 標準の codecvt ファセットの動作を変更するためのタグ (列挙) |
(C++11)(C++17で非推奨) | UTF-8 と UCS2/UCS4 の間で変換を行います (クラステンプレート) |
(C++11)(C++17で非推奨) | UTF-8 と UTF-16 の間で変換を行います (クラステンプレート) |