名前空間
変種
操作

文字セットとエンコーディング

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

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

目次

変換文字セット

変換文字セットは以下の要素で構成されます

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

変換文字セットは、基本文字セットおよび基本リテラル文字セット(下記参照)のスーパーセットです。

(C++23から)

[編集] 基本文字セット

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

コード単位 文字 グリフ
U+0009 文字タブ
U+000B 改行タブ
U+000C 改ページ (FF)
U+0020 スペース
U+000A 改行 (LF) new-line
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 ドル記号 $
U+0040 アットマーク @
U+0060 グレイブアクセント `
(C++26以降)

[編集] 基本リテラル文字セット

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

コード単位 文字
U+0000 ヌル
U+0007 ベル
U+0008 バックスペース
U+000D キャリッジリターン (CR)

[編集] 実行文字セット

実行文字セットおよび実行ワイド文字セットは、基本リテラル文字セットのスーパーセットです。実行文字セットのエンコーディングと追加要素のセット(もしあれば)はロケール固有です。実行ワイド文字セットの各要素は、個別のwchar_tコード単位として表現可能でなければなりません。

[編集] コード単位とリテラルエンコーディング

コード単位は文字型の整数値です。マルチバイト文字またはエンコード不可能な文字リテラルではない文字リテラル、または文字列リテラル内の文字は、エンコーディングプレフィックスによって決定される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によって変更されました。

新しい名前 古い名前
基本文字セット 基本ソース文字セット
基本リテラル文字セット 基本実行文字セット
基本実行ワイド文字セット

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

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

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

[編集] 関連項目

ASCIIチャート
Cドキュメント文字セットとエンコーディング
English 日本語 中文(简体) 中文(繁體)