namespace std {
void vprint_unicode(string_view fmt,
format_args args); // (1) C++23
void vprint_unicode(FILE* stream,
string_view fmt,
format_args args); // (2) C++23
}
概要
書式指定でUnicode出力する。
- (1) : 標準出力に、書式指定でUnicode出力する
- (2) : 指定された
FILE
に、書式指定でUnicode出力する
std::ostream
から派生したクラスオブジェクトに対して出力したい場合は、<ostream>
ヘッダのstd::vprint_unicode()
関数を使用すること。
事前条件
- (2)
stream
が有効な出力Cストリームを指していること
効果
-
(1) : 以下と等価:
vprint_unicode(stdout, fmt, args);
-
(2) :
-
C++23 :
-
以下の方法で自動変数を初期化する:
-
stream
がUnicodeを表示できる端末を参照している場合、ネイティブのUnicode APIを使用して端末に書き出す out
に無効なコードユニットが含まれる場合、その動作は未定義であり,実装者はそれを診断することが推奨される。それ以外の場合は、変更せずにストリームに書き出す。そうでなければ、変更せずstream
にout
を書き出す。- ネイティブのUnicode APIを使用する場合、この関数は
out
を書き出す前にフラッシュする
-
-
C++26 :
stream
のロックを取得するfmt
で書式指定に従って書式化されたargs
の文字表現をout
とするstream
がUnicodeを表示できる端末を参照している場合、ネイティブのUnicode APIを使用して端末に書き出すout
に無効なコードユニットが含まれる場合、その動作は未定義であり,実装者はそれを診断することが推奨される。それ以外の場合は、変更せずにストリームに書き出す。そうでなければ、変更せずstream
にout
を書き出す。- ネイティブのUnicode APIを使用する場合、この関数は
out
を書き出す前にフラッシュする - 関数終了時に、無条件にロックを手放す
-
例外
- (2) :
- C++23 :
vformat()
関数がなんらかの例外を送出する可能性がある
- C++23 :
- 端末かストリームへの書き込みに失敗した場合、
system_error
を送出する bad_alloc
を送出する可能性がある
備考
- POSIXおよびWindowsにおいて、「
stream
が端末を参照している」とは、それぞれ、isatty(fileno(stream))
、およびGetConsoleMode(_get_osfhandle(_fileno(stream)), ...) != 0
を意味する - Windowsにおいて、ネイティブなUnicode APIとは
WriteConsoleW()
である - 推奨の方式:ネイティブのUnicode APIを呼び出す際に文字コード変換が必要な場合、実装はUnicode標準 (Unicode Standard Version 14.0 - Core Specification, Chapter 3.9) に従って無効なコードユニットを「U+FFFD REPLACEMENT CHARACTER」で置き換える必要がある
バージョン
言語
- C++23
処理系
- Clang: 19 ✅
- GCC: 14 ✅
- ICC: ??
- Visual C++: 2022 Update 7 ✅