std:: codecvt_utf8_utf16
|
ヘッダーで定義
<codecvt>
|
||
|
template
<
class
Elem,
|
(C++11 で追加)
(C++17 で非推奨) (C++26 で削除) |
|
std::codecvt_utf8_utf16
は、
std::codecvt
ファセットであり、UTF-8でエンコードされたバイト文字列とUTF-16でエンコードされた文字列との間の変換をカプセル化します。
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 型の定数 |
メンバー関数
|
(constructor)
|
新しい
codecvt_utf8_utf16
ファセットを構築する
(public member function) |
|
(destructor)
|
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
(
)
;
|
||
ファセットを破棄します。ロケール管理のファセットとは異なり、このファセットのデストラクタは公開されています。
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
|
変換不要、入力型と出力型が同一 |
例
#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
>
|
該当なし |
| 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-16とUCS-2/UCS-4間の変換
(クラステンプレート) |