static text_encoding environment();
概要
環境エンコーディングを取得する。
環境エンコーディングとは、プログラムの実行環境が文字列の入出力に使用することを期待するエンコーディングである。これはコンパイル時ではなく実行時に決定される。
適格要件
CHAR_BIT == 8であること。
戻り値
実装定義の環境の文字エンコーディングスキームを表すtext_encodingオブジェクトを返す。
POSIX実装では、空文字列""で表されるPOSIXロケールに関連付けられたエンコーディングスキームが返される。
備考
この関数はsetlocale()の呼び出しに影響されない。
推奨される実装として、POSIXのsetenv()関数やその他の環境を変更できる関数の呼び出しによっても影響されないことが望ましい。
環境エンコーディングが適用される対象
環境エンコーディングは以下のものに対して使用されることが期待されるエンコーディングである:
- コマンドライン引数 :
main()のargvで受け取る文字列 - 環境変数 :
std::getenv()等で取得する値 - 標準入出力 : リダイレクトされていない
stdin、stdout、stderr
コンパイル環境と実行環境の違い
環境エンコーディングは実行環境(ターゲット環境)のプロパティであり、コンパイル環境のプロパティではない。クロスコンパイルを行う場合、コンパイル環境と実行環境のエンコーディングは異なりうる。
一方、literal()はコンパイル時に決定されるため、コンパイル環境のオプションによって決定される。
各プラットフォームでの決定方法
Linux
環境変数LC_CTYPE、LC_ALL、LANG(この優先順位で)から決定される。近年のディストリビューションでは多くの場合UTF-8である。
推奨実装として/proc/self/environを解析することで、プログラム起動後のsetenv()の影響を受けない初期の環境変数を取得できる。
macOS
Linuxと同様にPOSIXロケールから決定される。macOSではデフォルトでUTF-8が使用される。
推奨実装としてsysctl({CTL_KERN, KERN_PROCARGS, pid})で初期環境を取得できる。
Windows
GetACP()が返すアクティブコードページによって決定される。
- 日本語環境: CP932 (Windows-31J, Shift_JIS系)
- 英語環境: CP1252 (Windows-1252)
- UTF-8設定有効時: CP65001 (UTF-8)
注意点として、Windowsではコンソールのコードページ(GetConsoleCP()/GetConsoleOutputCP())がアクティブコードページと異なる場合がある。environment()はアクティブコードページを返し、コンソールのコードページではない。
GetACP()はsetenv()の影響を受けないため、Windowsでは推奨実装が自然に満たされる。
例
#include <text_encoding>
#include <print>
int main() {
auto env = std::text_encoding::environment();
std::println("Environment encoding: {}", env.name());
std::println("MIB: {}", static_cast<int>(env.mib()));
// リテラルエンコーディングと環境エンコーディングの比較
auto lit = std::text_encoding::literal();
if (lit == env) {
std::println("Literal and environment encodings match");
} else {
std::println("WARNING: Literal encoding ({}) differs from environment encoding ({})",
lit.name(), env.name());
}
}
出力例
Environment encoding: UTF-8
MIB: 106
Literal and environment encodings match
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: 15 ✅
- Visual C++: ??