エスケープシーケンス
エスケープシーケンスは、文字列リテラルと文字リテラル内で特定の特殊文字を表現するために使用されます。
利用可能なエスケープシーケンスは以下の通りです。
| エスケープ シーケンス |
説明 | 表現 |
|---|---|---|
| シンプルなエスケープシーケンス | ||
\'
|
単一引用符 | ASCIIエンコーディングでのバイト0x27 |
\"
|
二重引用符 | ASCIIエンコーディングでのバイト0x22 |
\?
|
疑問符 | ASCIIエンコーディングでのバイト0x3f |
\\
|
バックスラッシュ | ASCIIエンコーディングでのバイト0x5c |
\a
|
可聴ベル | ASCIIエンコーディングでのバイト0x07 |
\b
|
バックスペース | ASCIIエンコーディングでのバイト0x08 |
\f
|
フォームフィード - 新しいページ | ASCIIエンコーディングでのバイト0x0c |
\n
|
ラインフィード - 改行 | ASCIIエンコーディングでのバイト0x0a |
\r
|
キャリッジリターン | ASCIIエンコーディングでのバイト0x0d |
\t
|
水平タブ | ASCIIエンコーディングでのバイト0x09 |
\v
|
垂直タブ | ASCIIエンコーディングでのバイト0x0b |
| 数値エスケープシーケンス | ||
\nnn
|
任意の8進数値 | コード単位nnn (1〜3桁の8進数) |
\o{n...} (C++23以降) |
コード単位n... (任意の桁数の8進数) | |
\xn...
|
任意の16進数値 | コード単位n... (任意の桁数の16進数) |
\x{n...} (C++23以降) | ||
| 条件付きエスケープシーケンス[1] | ||
\c
|
実装定義 | 実装定義 |
| ユニバーサル文字名 | ||
\unnnn
|
任意のUnicode値; 複数のコード単位になる場合があります |
コードポイントU+nnnn (4桁の16進数) |
\u{n...} (C++23以降) |
コードポイントU+n... (任意の桁数の16進数) | |
\Unnnnnnnn
|
コードポイントU+nnnnnnnn (8桁の16進数) | |
\N{NAME} (C++23以降) |
任意のUnicode文字 | NAMEで指定された文字 (以下を参照) |
- ↑ 条件付きエスケープシーケンスは条件付きでサポートされます。各条件付きエスケープシーケンスの文字
cは、他のエスケープシーケンスの\の後に続く文字ではない基本ソース文字セット(C++23まで)基本文字セット(C++23以降)のメンバーです。
目次 |
[編集] ユニバーサル文字名の範囲
|
ユニバーサル文字名が、0x24 ( |
(C++11まで) |
|
基本ソース文字セットのメンバーまたは制御文字のコードポイントに対応するユニバーサル文字名が、文字または文字列リテラルの外部に出現する場合、プログラムは不正です。 ユニバーサル文字名がサロゲートコードポイント (0xD800-0xDFFFの範囲、含む) に対応する場合、プログラムは不正です。 UTF-16/32文字列リテラルで使用されるユニバーサル文字名が、ISO/IEC 10646 (0x0-0x10FFFFの範囲、含む) のコードポイントに対応しない場合、プログラムは不正です。 |
(C++11以降) (C++20まで) |
|
基本ソース文字セットのメンバーまたは制御文字のコードポイントに対応するユニバーサル文字名が、文字または文字列リテラルの外部に出現する場合、プログラムは不正です。 ユニバーサル文字名が、ISO/IEC 10646 (0x0-0x10FFFFの範囲、含む) のコードポイントに対応しない、またはサロゲートコードポイント (0xD800-0xDFFFの範囲、含む) に対応する場合、プログラムは不正です。 |
(C++20以降) (C++23まで) |
|
基本文字セットの文字または制御文字のスカラー値に対応するユニバーサル文字名が、文字または文字列リテラルの外部に出現する場合、プログラムは不正です。 ユニバーサル文字名が、翻訳文字セットの文字のスカラー値に対応しない場合、プログラムは不正です。 |
(C++23から) |
名前付きユニバーサル文字エスケープ
上記の構文のユニバーサル文字名は、名前付きユニバーサル文字です。n-char-sequenceがUnicode Standard (章4.8 名前) の対応する文字名、またはその文字名エイリアスのうち「control」、「correction」、「alternate」型のいずれかと等しい場合、その文字を指定します。そうでない場合、プログラムは不正です。 これらのエイリアスは、Unicode Character DatabaseのNameAliases.txtに記載されています。これらの名前またはエイリアスには、先頭または末尾にスペースがありません。 有効なn-char-sequenceは、大文字のラテン文字AからZ、数字、スペース、ハイフンマイナスのみを含まなければなりません。他の文字はUnicode文字名には決して出現しないため、n-char-sequenceに出現した場合、プログラムは常に不正となります。 |
(C++23から) | |||||||||||||||||||||||||||||
[編集] 注釈
\0は、ヌル終端文字列の終端ヌル文字を表すため、最も一般的に使用される8進エスケープシーケンスです。
改行文字\nは、テキストモードI/Oで使用される場合、特別な意味を持ちます。OS固有の改行表現(通常は1バイトまたはバイトシーケンス)に変換されます。一部のシステムでは、代わりに長さフィールドでラインをマークします。
8進エスケープシーケンスは3桁の8進数に制限されていますが、有効な8進数でない文字が先に見つかった場合はそこで終了します。
16進エスケープシーケンスには長さ制限がなく、有効な16進数でない最初の文字で終了します。単一の16進エスケープシーケンスで表される値が、この文字列リテラルで使用される文字型(char、char8_t、 (C++20以降)char16_t、char32_t、 (C++11以降)またはwchar_t)で表される値の範囲に収まらない場合、結果は未規定です。
|
狭い文字列リテラルまたは16ビット文字列リテラル内のユニバーサル文字名は、複数のコード単位にマッピングされる場合があります(例:\U0001f34cはUTF-8では4つのcharコード単位(\xF0\x9F\x8D\x8C)であり、UTF-16では2つのchar16_tコード単位(\xD83C\xDF4C)です)。 |
(C++11以降) |
疑問符エスケープシーケンス\?は、文字列リテラル内でトライグラフが解釈されるのを防ぐために使用されます。"??/"のような文字列は"\"としてコンパイルされますが、2番目の疑問符が"?\?/"のようにエスケープされると、"??/"になります。トライグラフがC++から削除されたため、疑問符エスケープシーケンスはもはや必要ありません。C++14(およびそれ以前のバージョン)およびCとの互換性のために保持されています。(C++17以降)
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_named_character_escapes |
202207L |
(C++23) | 名前付きユニバーサル文字エスケープ |
[編集] 例
出力
This is a test She said, "Sells she seashells on the seashore?"
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 505 | C++98 | バックスラッシュの後の文字が 表に指定されたものでない場合、動作は未定義でした。 |
条件付きでサポートされるようになりました。 (セマンティクスは実装定義です) |
[編集] 関連項目
| Cドキュメント エスケープシーケンスについて
|