文字セットとエンコーディング
このページでは、C++標準で指定されているいくつかの文字セットについて説明します。
変換文字セット変換文字セットは以下の要素で構成されます
変換文字セットは、基本文字セットおよび基本リテラル文字セット(下記参照)のスーパーセットです。 |
(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
|
| 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
|
| U+007B | 左中括弧 | {
|
| U+007C | 垂直線 | |
|
| U+007D | 右中括弧 | }
|
| U+007E | チルダ | ~
|
|
C++26以降、以下の文字が基本文字セットに追加されました
|
(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ドキュメントの文字セットとエンコーディング
|