- text_encoding[meta header]
- std[meta namespace]
- text_encoding[meta class]
- function[meta id-type]
- cpp26[meta cpp]
static consteval text_encoding literal() noexcept;リテラルエンコーディング(ordinary literal encoding)を取得する。
リテラルエンコーディングとは、コンパイラが通常の文字列リテラル("hello"やu8プレフィックスのない文字列)をオブジェクトファイルに書き込む際に使用するエンコーディングである。この関数はconstevalであり、コンパイル時にのみ呼び出すことができる。
CHAR_BIT == 8であること。
通常文字リテラルエンコーディングを表すtext_encodingオブジェクトを返す。
リテラルエンコーディングはコンパイルオプションによって決定される。以下に主要コンパイラにおける決定方法を示す。
- デフォルト: UTF-8
- 変更方法:
-fexec-charset=エンコーディング名- 例:
-fexec-charset=SHIFT_JIS
- 例:
- 内部でiconvを使用してエンコーディング変換を行う
- デフォルト: UTF-8
- 変更方法:
-fexec-charset=エンコーディング名- Clang 18以降でサポート
- 古いバージョンのClangではUTF-8固定
- デフォルト: システムのアクティブコードページ
- 日本語Windows環境: Windows-31J(CP932、Shift_JIS系)
- 英語Windows環境: Windows-1252
- 変更方法:
/execution-charset:utf-8: 実行文字セットをUTF-8にする/utf-8: ソース文字セットと実行文字セットの両方をUTF-8にする/execution-charset:shift_jis: 実行文字セットをShift_JISにする
GCCおよびClangはデフォルトでUTF-8をリテラルエンコーディングとして使用するが、MSVCは日本語Windowsのアクティブコードページ(Windows-31J / CP932)をデフォルトとする。
この違いにより、同じソースコードでもコンパイラによって文字列リテラルのバイト表現が異なることがある。例えば、"日本語"という文字列リテラルは:
- GCCおよびClang (デフォルト): UTF-8で
\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e - MSVC (日本語環境デフォルト): Shift_JISで
\x93\xfa\x96\x7b\x8c\xea
text_encoding::literal()を使用することで、このようなエンコーディングの違いをプログラム的に検出し、適切に処理できる。
#include <text_encoding>
#include <print>
int main() {
// コンパイル時にリテラルエンコーディングを取得
constexpr auto enc = std::text_encoding::literal();
std::println("Literal encoding: {}", enc.name());
// コンパイル時にUTF-8であることを検証
if constexpr (std::text_encoding::literal() == std::text_encoding::id::UTF8) {
std::println("UTF-8 literals are available");
}
// static_assertでの使用
static_assert(std::text_encoding::literal().mib() != std::text_encoding::id::unknown);
}- name()[link name.md]
- id::UTF8[link id.md]
- id::unknown[link id.md]
Literal encoding: UTF-8
UTF-8 literals are available
- C++26
- Clang: ??
- GCC: 15 [mark verified]
- Visual C++: ??