std:: codecvt_byname
|
ヘッダーで定義
<locale>
|
||
|
template
<
class
InternT,
class
ExternT,
class
State
>
class codecvt_byname : public std:: codecvt < InternT, ExternT, State > ; |
||
std::codecvt_byname
は、構築時に指定されたロケールのマルチバイト/ワイド文字変換ルールをカプセル化する
std::codecvt
ファセットです。
目次 |
特殊化
標準ライブラリは以下の特殊化を提供することが保証されています:
|
定義済みヘッダー
<locale>
|
|
| std :: codecvt_byname < char , char , std:: mbstate_t > | 同一変換 |
|
std
::
codecvt_byname
<
char16_t
,
char
,
std::
mbstate_t
>
(C++11以降) (C++20で非推奨) |
UTF-16とUTF-8間の変換 |
|
std
::
codecvt_byname
<
char16_t
, char8_t,
std::
mbstate_t
>
(C++20以降) |
UTF-16とUTF-8間の変換 |
|
std
::
codecvt_byname
<
char32_t
,
char
,
std::
mbstate_t
>
(C++11以降) (C++20で非推奨) |
UTF-32とUTF-8間の変換 |
|
std
::
codecvt_byname
<
char32_t
, char8_t,
std::
mbstate_t
>
(C++20以降) |
UTF-32とUTF-8間の変換 |
| std :: codecvt_byname < wchar_t , char , std:: mbstate_t > | ロケール固有のワイド文字列とナロー文字セット間の変換 |
メンバー関数
|
(constructor)
|
新しい
codecvt_byname
ファセットを構築する
(public member function) |
|
(destructor)
|
codecvt_byname
ファセットを破棄する
(protected member function) |
std::codecvt_byname:: codecvt_byname
|
explicit
codecvt_byname
(
const
char
*
name,
std::
size_t
refs
=
0
)
;
|
||
|
explicit
codecvt_byname
(
const
std::
string
&
name,
std::
size_t
refs
=
0
)
;
|
(C++11以降) | |
指定されたロケール名
name
に対して新しい
std::codecvt_byname
ファセットを構築します。
refs はリソース管理に使用されます: refs == 0 の場合、実装はこのファセットを保持する最後の std::locale オブジェクトが破棄されるときにファセットを破棄します。それ以外の場合、オブジェクトは破棄されません。
パラメータ
| name | - | ロケール名 |
| refs | - | ファセットにリンクする参照数 |
std::codecvt_byname:: ~codecvt_byname
|
protected
:
~codecvt_byname ( ) ; |
||
ファセットを破棄します。
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]
|
単一の
InternT
文字に変換される可能性のある最大の
ExternT
文字数を返す
(
std::codecvt<InternT,ExternT,StateT>
の仮想protectedメンバ関数)
|
std::codecvt_base から継承
| ネスト型 | 定義 |
| enum result { ok, partial, error, noconv } ; | 非スコープ列挙型 |
| 列挙定数 | 定義 |
ok
|
エラーなく変換が完了した |
partial
|
すべてのソース文字が変換されなかった |
error
|
無効な文字に遭遇した |
noconv
|
変換不要、入力型と出力型が同一 |
例
この例は、GB18030対応ロケールのcodecvtファセットを使用してGB18030エンコードされたファイルを読み込む方法を示しています。
#include <fstream> #include <iostream> #include <locale> #include <string> int main() { // GB18030 narrow multibyte encoding std::ofstream("text.txt") << "\x7a" // letter 'z', U+007a "\x81\x30\x89\x38" // letter 'ß', U+00df "\xcb\xae" // CJK ideogram '水' (water), U+6c34 "\x94\x32\xbc\x35"; // musical sign '𝄋' (segno), U+1d10b std::wifstream fin("text.txt"); fin.imbue(std::locale(fin.getloc(), new std::codecvt_byname<wchar_t, char, std::mbstate_t>("zh_CN.gb18030"))); for (wchar_t c; fin.get(c);) std::cout << std::hex << std::showbase << static_cast<unsigned>(c) << '\n'; }
出力例:
0x7a 0xdf 0x6c34 0x1d10b
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 21 | C++98 |
標準ライブラリは
任意の
std::codecvt_byname
特殊化を提供する必要がなかった
|
2つの特殊化が要求される |
関連項目
|
文字エンコーディング間の変換(UTF-8、UTF-16、UTF-32を含む)
(クラステンプレート) |