名前空間
変種
操作

std::codecvt_utf8

提供: cppreference.com
< cpp‎ | locale
 
 
 
ヘッダ <codecvt> で定義
template<

    class Elem,
    unsignedlong Maxcode =0x10ffff,
    std::codecvt_mode Mode =(std::codecvt_mode)0

>class codecvt_utf8 :publicstd::codecvt<Elem, char, std::mbstate_t>;
(C++11以上)
(C++17で非推奨)

std::codecvt_utf8 は UTF-8 エンコードされたバイト文字列と UCS2 または UTF-32 文字列 (Elem の型によります) の間の変換をカプセル化する std::codecvt ファセットです。 この codecvt ファセットはテキストとバイナリ両方の UTF-8 ファイルを読み書きするために使用できます。

目次

[編集]テンプレート引数

Elem - char16_tchar32_t または wchar_t のいずれか
Maxcode - このファセットがエラーなしに読み書きする Elem の最も大きな値
Mode - std::codecvt_mode 型の定数

[編集]メンバ関数

コンストラクタ
新しい codecvt_utf8 ファセットを構築します
(パブリックメンバ関数)
デストラクタ
codecvt_utf8 ファセットを破棄します
(パブリックメンバ関数)

std::codecvt_utf8::codecvt_utf8

explicit codecvt_utf8(std::size_t refs =0);

新しい std::codecvt_utf8 ファセットを構築し、初期参照カウンタ refs を基底クラスに渡します。

引数

refs - ファセットにリンクする参照の数

std::codecvt_utf8::~codecvt_utf8

~codecvt_utf8();

ファセットを破棄します。 ロケール管理されたファセットと異なり、このファセットのデストラクタはパブリックです。

std::codecvt から継承

メンバ型

メンバ型 定義
intern_typeinternT
extern_typeexternT
state_typestateT

メンバオブジェクト

メンバ名
id(static)std::locale::id

メンバ関数

do_out を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]
do_in を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]
do_unshift を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]
do_encoding を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]
do_always_noconv を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]
do_length を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]
do_max_length を呼びます
(std::codecvt<InternT,ExternT,State>のパブリックメンバ関数)[edit]

プロテクテッドメンバ関数

[仮想]
ファイルを書き込む時などのために、文字列を internT から externT に変換します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]
[仮想]
ファイルから読み込む時などのために、文字列を externT から internT に変換します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]
[仮想]
不完全な変換に対する externT 文字の終了文字シーケンスを生成します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]
[仮想]
一定であれば、ひとつの internT 文字を生成するのに必要な externT の文字数を返します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]
ファセットがすべての有効な引数の値に対して恒等変換をエンコードするかどうか調べます
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]
[仮想]
与えられた internT バッファへの変換によって消費されるであろう externT 文字列の長さを計算します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]
単一の internT 文字に変換される可能性のある externT の最大文字数を返します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数)[edit]


std::codecvt_base から継承

メンバ型 定義
enum result { ok, partial, error, noconv }; スコープなし列挙型
列挙定数 定義
ok 変換はエラーなしで完了しました
partial 変換元の文字は全部は変換されませんでした
error 無効な文字に遭遇しました
noconv 変換は必要ありません、入力と出力の型は同じです

[編集]ノート

標準は、 Elem のサイズが16ビットのときはこのファセットが UCS2 で動作することを要求していますが、一部の処理系は代わりに UTF-16 を使用し、これを無変換ファセットとしています。 用語「UCS2」は非推奨であり、 Unicode 標準からは削除されました。

[編集]

以下の例は UCS2/UTF-8 と UTF-16/UTF-8 の変換の差をデモンストレーションします。 文字列中の3文字目は有効な UCS2 文字ではありません。

#include <iostream>#include <string>#include <locale>#include <codecvt>   int main(){// UTF-8 data. The character U+1d10b, musical sign segno, does not fit in UCS2std::string utf8 = u8"z\u6c34\U0001d10b";   // the UTF-8 / UTF-16 standard conversion facetstd::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;std::u16string utf16 = utf16conv.from_bytes(utf8);std::cout<<"UTF16 conversion produced "<< utf16.size()<<" code units:\n";for(char16_t c : utf16)std::cout<<std::hex<<std::showbase<< c <<'\n';   // the UTF-8 / UCS2 standard conversion facetstd::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv;try{std::u16string ucs2 = ucs2conv.from_bytes(utf8);}catch(conststd::range_error& e){std::u16string ucs2 = ucs2conv.from_bytes(utf8.substr(0, ucs2conv.converted()));std::cout<<"UCS2 failed after producing "<<std::dec<< ucs2.size()<<" characters:\n";for(char16_t c : ucs2)std::cout<<std::hex<<std::showbase<< c <<'\n';}}

出力:

UTF16 conversion produced 4 code units: 0x7a 0x6c34 0xd834 0xdd0b UCS2 failed after producing 2 characters: 0x7a 0x6c34

[編集]関連項目

文字変換 ロケール定義のマルチバイト
(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

mbrtoc32 / c32rtomb

codecvt<char32_t, char, mbstate_t>
codecvt_utf8<char32_t>
codecvt_utf8<wchar_t>(Windows以外)

codecvt_utf16<char32_t>
codecvt_utf16<wchar_t>(Windows以外)

システム全体:
UTF-32(Windows以外)
UCS2(Windows)

mbsrtowcs / wcsrtombs
use_facet<codecvt
<wchar_t, char, mbstate_t>>(locale)

No No
UTF-8, UTF-16, UTF-32 を含む文字エンコーディング間の変換を行います
(クラステンプレート)[edit]
(C++11)(C++17で非推奨)
標準の codecvt ファセットの動作を変更するためのタグ
(列挙)[edit]
(C++11)(C++17で非推奨)
UTF-16 と UCS2/UCS4 の間で変換を行います
(クラステンプレート)[edit]
(C++11)(C++17で非推奨)
UTF-8 と UTF-16 の間で変換を行います
(クラステンプレート)[edit]
close