• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

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

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

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

    概要

    C++11で追加された文字型char16_tchar32_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_tchar32_tはUTF-16/UTF-32エンコーディングであると規定されていた。

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

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

    関連項目

    参照