std::codecvt_utf8_utf16
| ヘッダー <codecvt> で定義 |
||
| template< class Elem, |
(C++11以降) (C++17で非推奨) (C++26で削除) |
|
std::codecvt_utf8_utf16 は、UTF-8 エンコードされたバイト文字列と UTF-16 エンコードされた文字文字列間の変換をカプセル化する std::codecvt ファセットです。Elem が32ビット型の場合、1つのUTF-16コードユニットが、出力シーケンスの各32ビット文字に格納されます。
これはN:M変換ファセットであり、std::basic_filebuf(内部エンコーディングと外部エンコーディングの間で、UTF-32/UTF-8のような1:N変換のみを許可する)では使用できません。このファセットは std::wstring_convert で使用できます。
目次 |
[編集] テンプレートパラメータ
| Elem | - | char16_t、char32_t、または wchar_t のいずれか |
| Maxcode | - | このファセットがエラーなしで読み書きする Elem の最大値 |
| Mode | - | std::codecvt_mode 型の定数 |
[編集] メンバ関数
| (コンストラクタ) |
新しい codecvt_utf8_utf16 ファセットを構築します。(public member function) |
| (デストラクタ) |
codecvt_utf8_utf16 ファセットを破棄します。(public member function) |
std::codecvt_utf8_utf16::codecvt_utf8_utf16
| explicit codecvt_utf8_utf16( std::size_t refs = 0 ); |
||
新しい std::codecvt_utf8_utf16 ファセットを構築します。初期参照カウンタ refs を基底クラスに渡します。
パラメータ
| refs | - | ファセットを参照する参照の数 |
std::codecvt_utf8_utf16::~codecvt_utf8_utf16
| ~codecvt_utf8_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
|
変換は不要、入力と出力の型は同じです |
[編集] 例
#include <cassert> #include <codecvt> #include <cstdint> #include <iostream> #include <locale> #include <string> int main() { std::string u8 = "z\u00df\u6c34\U0001f34c"; std::u16string u16 = u"z\u00df\u6c34\U0001f34c"; // UTF-8 to UTF-16/char16_t std::u16string u16_conv = std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(u8); assert(u16 == u16_conv); std::cout << "UTF-8 to UTF-16 conversion produced " << u16_conv.size() << " code units:\n" << std::showbase << std::hex; for (char16_t c : u16_conv) std::cout << static_cast<std::uint16_t>(c) << ' '; // UTF-16/char16_t to UTF-8 std::string u8_conv = std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(u16); assert(u8 == u8_conv); std::cout << "\nUTF-16 to UTF-8 conversion produced " << std::dec << u8_conv.size() << " bytes:\n" << std::hex; for (char c : u8_conv) std::cout << +static_cast<unsigned char>(c) << ' '; std::cout << '\n'; }
出力
UTF-8 to UTF-16 conversion produced 5 code units: 0x7a 0xdf 0x6c34 0xd83c 0xdf4c UTF-16 to UTF-8 conversion produced 10 bytes: 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開された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-16とUCS-2/UCS-4の間で変換を行う (クラステンプレート) |