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

履歴 編集

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

概要

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

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

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

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

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

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

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

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

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

関連項目

参照