std::codecvt_mode
From cppreference.com
| ヘッダー <codecvt> で定義 |
||
| enum codecvt_mode { consume_header = 4, |
(C++11以降) (C++17で非推奨) (C++26で削除) |
|
std::codecvt_utf8、std::codecvt_utf16、およびstd::codecvt_utf8_utf16のファセットは、Unicode文字列変換のオプション機能を示すstd::codecvt_mode型のオプション値を受け取ります。
[編集] 定数
| ヘッダー
<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の間で変換を行う (クラステンプレート) |