名前空間
変種
操作

エスケープシーケンス

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

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

エスケープシーケンスは、文字列リテラル文字リテラル内で特定の特殊文字を表現するために使用されます。

利用可能なエスケープシーケンスは以下の通りです。

エスケープ
シーケンス
説明 表現
シンプルなエスケープシーケンス
\' 単一引用符 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で指定された文字 (以下を参照)
  1. 条件付きエスケープシーケンスは条件付きでサポートされます。各条件付きエスケープシーケンスの文字cは、他のエスケープシーケンスの\の後に続く文字ではない基本ソース文字セット(C++23まで)基本文字セット(C++23以降)のメンバーです。

目次

[編集] ユニバーサル文字名の範囲

ユニバーサル文字名が、0x24 ($)、0x40 (@)、0x60 (`) 以外の、0xA0未満のコードポイントに対応する場合、プログラムは不正です。言い換えれば、基本ソース文字セットのメンバーおよび制御文字 (0x0-0x1Fおよび0x7F-0x9Fの範囲) は、ユニバーサル文字名で表現できません。

(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{ n-char-sequence }
n-char-sequence - 1つ以上のn-char
n-char - 右中括弧}または改行文字を除く翻訳文字セットの文字

上記の構文のユニバーサル文字名は、名前付きユニバーサル文字です。n-char-sequenceUnicode Standard (章4.8 名前) の対応する文字名、またはその文字名エイリアスのうち「control」、「correction」、「alternate」型のいずれかと等しい場合、その文字を指定します。そうでない場合、プログラムは不正です。

これらのエイリアスは、Unicode Character DatabaseNameAliases.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進エスケープシーケンスで表される値が、この文字列リテラルで使用される文字型(charchar8_t(C++20以降)char16_tchar32_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) 名前付きユニバーサル文字エスケープ

[編集]

#include <iostream>
 
int main()
{
    std::cout << "This\nis\na\ntest\n\n";
    std::cout << "She said, \"Sells she seashells on the seashore?\"\n";
}

出力

This
is
a
test
 
She said, "Sells she seashells on the seashore?"

[編集] 欠陥報告

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

DR 適用対象 公開された動作 正しい動作
CWG 505 C++98 バックスラッシュの後の文字が
表に指定されたものでない場合、動作は未定義でした。
条件付きでサポートされるようになりました。
(セマンティクスは実装定義です)

[編集] 関連項目

Cドキュメント エスケープシーケンスについて
English 日本語 中文(简体) 中文(繁體)