Namespaces
Variants

Character sets and encodings

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

このページでは、C++標準で規定されているいくつかの文字セットについて説明します。

目次

翻訳文字集合

翻訳文字集合 は以下の要素で構成される:

  • Unicode コード空間でコードポイントが割り当てられた各抽象文字、および
  • 抽象文字に割り当てられていない各Unicodeスカラ値に対する個別の文字

翻訳文字集合は、基本文字集合と基本リテラル文字集合(後述)の上位集合である。

(C++23以降)

基本文字セット

以下の 基本文字セット 96 (C++26まで) 99 (C++26以降) 文字で構成されます:

コードポイント 文字名 グリフ
U+0009 文字タブulation
U+000B 行タブulation
U+000C フォームフィード (FF)
U+0020 スペース
U+000A ラインフィード (LF) 改行
U+0021 感嘆符 !
U+0022 引用符 "
U+0023 番号記号 #
U+0025 パーセント記号 %
U+0026 アンパサンド &
U+0027 アポストロフィ '
U+0028 左括弧 (
U+0029 右括弧 )
U+002A アスタリスク *
U+002B プラス記号 +
U+002C コンマ ,
U+002D ハイフンマイナス -
U+002E 終止符 .
U+002F ソリダス /
U+0030 .. U+0039 数字 ゼロ .. ナイン 0 1 2 3 4 5 6 7 8 9
U+003A コロン :
U+003B セミコロン ;
U+003C 小なり記号 <
U+003D 等号 =
U+003E 大なり記号 >
U+003F 疑問符 ?
U+0041 .. U+005A ラテン大文字 A .. Z A B C D E F G H I J K L M

N O P Q R S T U V W X Y Z

U+005B 左角括弧 [
U+005C リバースソリダス \
U+005D 右角括弧 ]
U+005E 曲折アクセント ^
U+005F 下線 _
U+0061 .. U+007A ラテン小文字 a .. z a b c d e f g h i j k l m

n o p q r s t u v w x y z

U+007B 左中括弧 {
U+007C 垂直線 |
U+007D 右中括弧 }
U+007E チルダ ~

C++26以降、以下の文字が基本文字セットに追加されました:

コードポイント 文字 グリフ
U+0024 Dollar Sign $
U+0040 Commercial At @
U+0060 Grave Accent `
(C++26以降)

基本リテラル文字セット

基本リテラル文字セットは、基本文字セットのすべての文字に加えて、以下の制御文字で構成されます:

コードポイント 文字
U+0000 Null
U+0007 Bell
U+0008 Backspace
U+000D キャリッジリターン (CR)

実行文字集合

実行文字集合と実行ワイド文字集合は、基本リテラル文字集合の上位集合です。 実行文字集合のエンコーディングと追加要素の集合(存在する場合)はロケール固有です。 実行ワイド文字集合の各要素は、個別の wchar_t コード単位として表現可能でなければなりません。

コード単位とリテラルエンコーディング

code unit は文字型の整数値です。 character literal においてマルチキャラクタまたは非エンコード可能文字リテラル以外のもの、または string literal 内の文字は、エンコーディングプレフィックスによって決定される1つ以上のcode unitのシーケンスとしてエンコードされます。これはそれぞれの literal encoding と呼ばれます。

実行文字集合のうちの1つのリテラルエンコーディングまたはロケール固有のエンコーディングは、基本リテラル文字集合の各要素を、非負の値を持つ単一のコード単位で符号化し、他のいずれの要素のコード単位とも異なる値を持つ。基本リテラル文字集合に含まれない文字は、複数のコード単位で符号化されることがあり、そのようなコード単位の値は、基本リテラル文字集合の要素のコード単位の値と同じである可能性がある。実行文字集合のエンコーディングは、いずれのリテラルエンコーディングとも無関係であり得る。

通常リテラルエンコーディングは、通常の文字リテラルまたは文字列リテラルに適用されるエンコーディングです。ワイドリテラルエンコーディングは、ワイド文字リテラルまたはワイド文字列リテラルに適用されるエンコーディングです。

U+0000 NULL文字は値0としてエンコードされます。変換文字セットの他の要素は値0のコード単位でエンコードされません。数字0 (U+0030)以降の各10進数字文字のコード単位値は、前の文字の値より1大きくなります。通常リテラルとワイドリテラルのエンコーディングはそれ以外は実装定義です。

UTF-8、UTF-16、またはUTF-32リテラルについて、変換文字集合の各文字に対応するUCSスカラ値は、それぞれのUCS符号化方式についてISO/IEC 10646で規定されている通りに符号化されます。

注記

C++23では一部の文字セットの標準名が P2314R4 によって変更されました。

新しい名称 旧名称
basic character set basic source character set
basic literal character set basic execution character set
basic execution wide-character set

UTF-8ソースファイル以外のソースファイルから (UTF-8ソースファイル以外) (C++23以降) 文字の 基本文字集合 (C++23以前) 変換文字集合 (C++23以降) へのマッピングは 翻訳フェーズ1 において実装定義であるため、実装は基本ソース文字がソースファイル内でどのように表現されるかを文書化する必要があります。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 788 C++98 実行文字集合のメンバーの値は
実装定義であったが、ロケール固有ではなかった
ロケール固有である
CWG 1796 C++98 基本実行(ワイド)文字集合における
ナル(ワイド)文字の表現は全てのビットがゼロであった
値がゼロであることのみが要求される

関連項目

ASCII チャート
C ドキュメント for 文字セットとエンコーディング