std::codecvt_mode
ja.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間の変換
(クラステンプレート) |