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

履歴 編集

# UTF-8文字リテラル [N4267](C++17)

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

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

## 概要

C++14までは、UTF-8エンコーディングであることを示す`u8`プレフィックスを、文字列リテラルに対してのみ指定できた。C++17では、文字リテラルに対しても`u8`プレフィックスを付けられる。

    char s[] = u8"あいうえお"; // OK : C++11以降
    char c = u8'A'; // OK : C++17以降

C++20ではUTF-8文字リテラルの型が`char`ではなく`char8_t`になる

## 仕様

- `u8`プレフィックスが付いた文字リテラルは、`char`文字型の、UTF-8文字リテラルとなる
- UTF-8文字リテラルの値は、ISO 10646のコードポイント値と同値となる。そのコードポイント値は、単一のUTF-8コードユニットで表現できること
  - UTF-8文字リテラルが扱えるコードポイントの範囲は、C0 Controls and Basic Latin Unicode block (C0制御文字とラテン基本文字)となる
  - そのコードポイント範囲を超える値が指定された場合、プログラムは不適格となる

## 関連項目

- C++11 UTF-8文字列リテラル
- C++11 `char16_t`と`char32_t`
- C++20 UTF-8エンコーディングされた文字の型として`char8_t`を追加
- ostream `operator<<`

## 参照

- N4267 Adding `u8` character literals
- C0 Controls and Basic Latin - The Unicode Consortium
- 基本ラテン文字 (Unicodeのブロック) - Wikipedia