Namespaces
Variants

std:: codecvt_mode

From cppreference.net
ヘッダーで定義 <codecvt>
enum codecvt_mode {

consume_header = 4 ,
generate_header = 2 ,
little_endian = 1

} ;
(C++11以降)
(C++17で非推奨)
(C++26で削除)

ファセット std::codecvt_utf8 std::codecvt_utf16 および std::codecvt_utf8_utf16 は、テンプレート引数として std::codecvt_mode 型のオプション値を受け入れ、これはUnicode文字列変換のオプション機能を指定します。

定数

定義済みヘッダー <locale>
列挙子 意味
little_endian 入力がリトルエンディアンバイト順であると仮定する(UTF-16入力のみに適用され、デフォルトはビッグエンディアン)
consume_header 入力シーケンスの先頭にバイト順マークが存在する場合、それを消費し、(UTF-16の場合)そのバイト順に基づいて残りの入力をデコードする
generate_header 出力シーケンスの先頭にバイト順マークを出力する

認識されるバイトオーダーマークは以下の通りです:

0xfe 0xff UTF-16 ビッグエンディアン
0xff 0xfe UTF-16 リトルエンディアン
0xef 0xbb 0xbf UTF-8 (エンディアン性に影響なし)

ファイルの先頭にバイトオーダーマークがある場合に std::consume_header を選択しないと、Unicode文字U+FEFF(ゼロ幅非改行スペース)が文字列コンテンツの最初の文字として読み込まれます。

以下の例はUTF-8 BOMの消費を示しています:

#include <codecvt>
#include <cwchar>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>
int main()
{
    // UTF-8 data with BOM
    std::ofstream{"text.txt"} << "\ufeffz\u6c34\U0001d10b";
    // read the UTF-8 file, skipping the BOM
    std::wifstream fin{"text.txt"};
    fin.imbue(std::locale(fin.getloc(),
                          new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>));
    for (wchar_t c; fin.get(c);)
        std::cout << std::hex << std::showbase << (std::wint_t)c << '\n';
}

出力:

0x7a
0x6c34
0x1d10b

関連項目

文字エンコーディング間の変換(UTF-8、UTF-16、UTF-32を含む)
(クラステンプレート)
(C++11) (C++17で非推奨) (C++26で削除)
UTF-8とUCS-2/UCS-4間の変換
(クラステンプレート)
(C++11) (C++17で非推奨) (C++26で削除)
UTF-16とUCS-2/UCS-4間の変換
(クラステンプレート)
(C++11) (C++17で非推奨) (C++26で削除)
UTF-8とUTF-16間の変換
(クラステンプレート)