最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# char16_tとchar32_tの文字・文字列リテラルを、文字コードUTF-16/32に規定 [P1041R4](C++20)

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++11で追加された文字型`char16_t`と`char32_t`の文字・文字列リテラルの文字コード、C++20からはUTF-16とUTF-32であることが規定される。

これまでは、以下のような仕様であった：

- `<cuchar>`ヘッダでマクロ`__STDC_UTF_16__`が定義される場合、`char16_t`型の値はUTF-16の妥当なコードポイントを持つ。そうでない場合、`char16_t`型の値は実装定義の文字コードとなる。
- `<cuchar>`ヘッダでマクロ`__STDC_UTF_32__`が定義される場合、`char32_t`型の値はUTF-32の妥当なコードポイントを持つ。そうでない場合、`char32_t`型の値は実装定義の文字コードとなる。

C++20では、無条件にUTF-16とUTF-32であることが規定される。

なお、`u8`プレフィックスをつけた文字・文字列リテラルは、UTF-8であることがこれまでに規定されていた。

## この機能が必要になった背景・経緯

これまで、`<cuchar>`ヘッダのマクロ`__STDC_UTF_16__`と`__STDC_UTF_32__`が定義されている場合にのみ、`char16_t`と`char32_t`はUTF-16/UTF-32エンコーディングであると規定されていた。

しかし、これらが定義されなかった場合にコンパイラがほかのエンコーディングを選択することが疑わしかった。また、`char16_t`の仕様として「サロゲートペア」が含まれているが、その概念をもつ他のよく知られた文字コードはない。単一の文字を32ビットで表現する他のよく知られた文字コードもない。

実際にはすべての実装でこれらの文字・文字列リテラルはUTF-16とUTF-32にエンコーディングされるため、要件を示すだけではなく、より明確にするために、`char16_t`と`char32_t`の文字・文字列リテラルがUTF-16とUTF-32文字コードであることを規定する。

## 関連項目

- C++11 `char16_t`と`char32_t`
- C++11 UTF-8文字列リテラル
- C++17 UTF-8文字リテラル

## 参照

- P1041R4 Make `char16_t`/`char32_t` string literals be UTF-16/32