C++ 文字リテラル
文字リテラルは、定数文字で構成されます。 これは単一引用符で囲んだ文字によって表されます。 文字リテラルには次の 2 種類があります。
char 型のナロー文字リテラル。たとえば 'a'
wchar_t 型のワイド文字リテラル。たとえば L'a'
文字リテラルに使用する文字には、任意のグラフィック文字を含めることができます。ただし、改行 (\n)、円記号 (\)、単一引用符 (')、二重引用符 (") などの予約文字は除きます。 予約文字を含めるには、エスケープ シーケンスを使用して指定する必要があります。
エスケープ シーケンス
エスケープ シーケンスには、単純、8 進数、16 進数、Unicode (UTF-8)、Unicode (UTF-16) の 5 種類があります。 エスケープ シーケンスとして次のいずれかを使用できます。
値 |
エスケープ シーケンス |
---|---|
改行 |
\n |
水平タブ |
\t |
垂直タブ |
\v |
バックスペース |
\b |
キャリッジ リターン |
\r |
フォーム フィード |
\f |
警告 |
\a |
円記号 |
\\ |
疑問符 (?) |
? または \? |
単一引用符 (') |
\' |
二重引用符 (") |
\" |
null 文字 |
\0 |
8 進数 |
\ooo |
16 進数 |
\xhhh |
Unicode (UTF-8) |
\uxxxx |
Unicode (UTF-16) |
\Uxxxxxxxx |
次に、エスケープ文字の例をいくつか示します。
#include <iostream>
using namespace std;
int main() {
char newline = '\n';
char tab = '\t';
char backspace = '\b';
char backslash = '\\';
char nullChar = '\0';
cout << "Newline character: " << newline << "ending" << endl; // Newline character:
// ending
cout << "Tab character: " << tab << "ending" << endl; // Tab character : ending
cout << "Backspace character: " << backspace << "ending" << endl; // Backspace character : ending
cout << "Backslash character: " << backslash << "ending" << endl; // Backslash character : \ending
cout << "Null character: " << nullChar << "ending" << endl; //Null character: ending
}
\U の付いた UTF-16 エスケープ シーケンスについては、「C++ 文字列リテラル」を参照してください。
Microsoft 固有の仕様 →
8 進数のエスケープ シーケンスは、円記号を前置した最大 3 桁の 8 進数のシーケンスです。 4 桁以上を含む 8 進数のエスケープ シーケンスの動作は実装定義です。これらは、想定外の結果を生じる可能性があります。 次に例を示します。
char c1 = '\100'; // char '@'
char c2 = '\1000'; // char '0'
8 進数以外の文字を含むエスケープ シーケンスは、最後の 8 進数以外の文字として評価されます。 次に例を示します。
char c3 = '\009'// char '9'
char c4 = '\089' // char '9'
char c5 = '\qrs' // char 's'
16 進数のエスケープ シーケンスは、円記号と x を前置した 16 進数のシーケンスです。 16 進数の数字を含まないエスケープ シーケンスでは、"16 進型定数には、少なくとも 1 桁の 16 進数が必要です" という C2153 コンパイラ エラーが発生します。 16 進数と 16 進数以外の文字を含むエスケープ シーケンスは、最後の 16 進数以外の文字として評価されます。 最大の 16 進値は 0xff です。
char c1 = '\x0050'; // char 'P'
char c2 = '\x0pqr'; // char 'r'
END Microsoft 固有の仕様
円記号 (\) は、行の末尾に置かれている場合は行連結文字です。 円記号が文字リテラルとして表示されるようにするには、円記号を 2 つ並べて (\\) 入力する必要があります。 行連結文字の詳細については、「変換フェーズ」を参照してください。
Unicode 文字
UTF-8 エンコーディングされた Unicode 文字はプレフィックス \u を付けて表されます。 次に例を示します。
const wchar_t chr1 = L'\u79c1';
多くの場合、目的の文字をそのまま入力できます。
const wchar_t chr2 = L'私';
Visual C++ エディターの設定
Visual C++ コード エディターでは既定で、ロケールに適したエンコーディングが使用されます。 英語バージョンの Visual Studio で、既定のコード ページは 1252 です。 ただし、たとえば Unicode 文字など、別の種類の文字を追加してファイルを保存すると、"このファイルの Unicode 文字の一部は現在のコードページでは保存できません。 データを保持するために Unicode で保存しなおしますか?" というメッセージが表示されます。他のエンコーディングを使用してファイルを保存できます。 [ファイル] メニューの [保存オプションの詳細設定] ダイアログを使用して、ファイルのコードページを変更することもできます。 また [ツール]、[オプション]、[テキスト エディター]、[全般] オプション ページで、[シグネチャ (BOM) なしの UTF-8 エンコードを自動検出] をオフにして、Unicode 文字の自動検出を無効にすることができます。