最終更新日時(UTC):
が更新

履歴 編集

function
<text_encoding>

std::text_encoding::environment(C++26)

static text_encoding environment();

概要

環境エンコーディングを取得する。

環境エンコーディングとは、プログラムの実行環境が文字列の入出力に使用することを期待するエンコーディングである。これはコンパイル時ではなく実行時に決定される。

適格要件

CHAR_BIT == 8であること。

戻り値

実装定義の環境の文字エンコーディングスキームを表すtext_encodingオブジェクトを返す。

POSIX実装では、空文字列""で表されるPOSIXロケールに関連付けられたエンコーディングスキームが返される。

備考

この関数はsetlocale()の呼び出しに影響されない。

推奨される実装として、POSIXのsetenv()関数やその他の環境を変更できる関数の呼び出しによっても影響されないことが望ましい。

環境エンコーディングが適用される対象

環境エンコーディングは以下のものに対して使用されることが期待されるエンコーディングである:

  • コマンドライン引数 : main()argvで受け取る文字列
  • 環境変数 : std::getenv()等で取得する値
  • 標準入出力 : リダイレクトされていないstdinstdoutstderr

コンパイル環境と実行環境の違い

環境エンコーディングは実行環境(ターゲット環境)のプロパティであり、コンパイル環境のプロパティではない。クロスコンパイルを行う場合、コンパイル環境と実行環境のエンコーディングは異なりうる。

一方、literal()はコンパイル時に決定されるため、コンパイル環境のオプションによって決定される。

各プラットフォームでの決定方法

Linux

環境変数LC_CTYPELC_ALLLANG(この優先順位で)から決定される。近年のディストリビューションでは多くの場合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

処理系

参照