[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文字コードであることを規定する。下に提供されています。