C#における文字列と特殊文字
C#において、文字列は通常、ダブルクォーテーション(")で囲んで表現されます。しかし、文字列の内部に「改行」や「タブ」といった制御文字、あるいは「ダブルクォーテーション」自体を含めたい場合があります。
このような特殊な文字を文字列リテラル内に記述するために使用されるのが、「エスケープシーケンス(Escape Sequence)」です。
この記事では、C#で利用できる主要なエスケープシーケンスの種類とその意味、具体的な使用方法について詳しく解説します。
エスケープシーケンスとは
エスケープシーケンスは、バックスラッシュ(\、日本語環境では円記号として表示されることもあります)から始まる特定の文字の組み合わせです。
コンパイラは、文字列リテラル内でこのシーケンスを発見すると、それを文字通りの文字列としてではなく、特別な意味を持つ制御文字や記号として解釈します。
主要なエスケープシーケンス一覧
C#で使用できる主なエスケープシーケンスとその意味は以下の通りです。
| シーケンス | 名称 | 意味 |
\' | シングルクォーテーション | 文字リテラル(char型)内でシングルクォーテーションを表現します。 |
\" | ダブルクォーテーション | 文字列リテラル内でダブルクォーテーションを表現します。 |
\\ | バックスラッシュ | バックスラッシュ(円記号)自体を表現します。 |
\0 | Null文字 | Null文字(ヌル文字、値が0)を表現します。 |
\a | 警告(アラート) | システムの警告音(ビープ音)を鳴らします。 |
\b | バックスペース | カーソルを1文字分戻します(ただし、コンソール出力では動作が異なる場合があります)。 |
\f | フォームフィード | 改ページ(プリンターの制御文字)。 |
\n | 改行(ラインフィード) | カーソルを次の行の先頭に移動させます。 |
\r | 復帰(キャリッジリターン) | カーソルを現在の行の先頭に戻します。 |
\t | 水平タブ | カーソルを次のタブストップ位置まで移動させます。 |
\v | 垂直タブ | 垂直タブ(プリンターの制御文字)。 |
\u | Unicode(16進) | \uに続く4桁の16進数で指定されたUnicode文字を表現します。 |
\x | 16進数 | \xに続く1~4桁の16進数で指定された文字コードの文字を表現します。 |
エスケープシーケンスの使用例
具体的なコード例を用いて、これらのシーケンスがどのように機能するかを示します。
例1: 改行とタブによる整形
\n(改行)と\t(タブ)は、コンソール出力やログファイルなどのテキストを整形する際に頻繁に使用されます。
using System;
public class FormattingExample
{
public static void Main()
{
// ヘッダー行とデータ行をタブで揃える
string header = "商品ID\t商品名\t\t価格";
string item1 = "A-001\t商品アルファ\t1500";
string item2 = "B-002\t商品ベータ\t\t2200";
// \n を使って各データを改行して出力
string formattedText = header + "\n" + item1 + "\n" + item2;
Console.WriteLine(formattedText);
}
}
出力結果:
商品ID 商品名 価格
A-001 商品アルファ 1500
B-002 商品ベータ 2200
例2: 引用符とファイルパスの表現
文字列内に"(ダブルクォーテーション)を含めたい場合や、Windowsのファイルパスで\(バックスラッシュ)を表現したい場合は、それぞれ\"と\\を使用します。
using System;
public class PathExample
{
public static void Main()
{
// メッセージ内にダブルクォーテーションを含める
string message = "システムが \"DEFAULT\" 設定をロードしました。";
Console.WriteLine(message);
// Windowsのファイルパスを表現する
// \ はエスケープシーケンスの開始文字であるため、\\ と重ねる必要がある
string logFilePath = "C:\\Application\\Logs\\system.log";
Console.WriteLine("ログファイルパス: " + logFilePath);
}
}
出力結果:
システムが "DEFAULT" 設定をロードしました。
ログファイルパス: C:\Application\Logs\system.log
例3: Unicodeと16進数による特殊文字
著作権マーク(©)や通貨記号(¥)など、キーボードから直接入力しにくい特殊文字は、Unicodeや16進数のエスケープシーケンスで表現できます。
using System;
using System.Text;
public class SpecialCharExample
{
public static void Main()
{
// コンソールのエンコーディングをUTF-8に設定(文字化け防止)
Console.OutputEncoding = Encoding.UTF8;
// \u (Unicode) を使用
// \u00A9 = 著作権マーク (©)
// \u00A5 = 円記号 (¥)
string copyright = "Copyright \u00A9 2025 Example Corp.";
// \x (16進数) を使用
// \xAE = 登録商標マーク (®)
string trademark = "ProductX\xAE は登録商標です。";
Console.WriteLine(copyright);
Console.WriteLine(trademark);
}
}
出力結果:
Copyright © 2025 Example Corp.
ProductX® は登録商標です。
補足: 逐語的文字列リテラル
ファイルパスのように\が多用される文字列では、エスケープシーケンス(\\)を繰り返すと可読性が低下することがあります。
その場合、文字列リテラルの先頭に@(アットマーク)を付けた「逐語的文字列リテラル(Verbatim String Literal)」を使用できます。@を付けると、文字列内の\はエスケープ文字として解釈されなくなります(唯一の例外は""で、これは"一文字として解釈されます)。
// エスケープシーケンスを使用
string originalPath = "C:\\Projects\\MyApp\\Source\\Program.cs";
// 逐語的文字列リテラルを使用
string verbatimPath = @"C:\Projects\MyApp\Source\Program.cs";
Console.WriteLine(originalPath);
Console.WriteLine(verbatimPath);
// 逐語的文字列リテラル内で " を表現する場合
string message = @"彼は ""Hello"" と言った。";
Console.WriteLine(message);
まとめ
エスケープシーケンスは、C#の文字列リテラル内で制御文字や特殊な記号を正確に表現するために不可欠な機能です。\nや\t、\"、\\は特によく使用されます。
一方で、ファイルパスなどを扱う際は、@を用いた逐語的文字列リテラルを利用することで、コードの可読性を高めることができます。状況に応じて適切に使い分けることが重要です。
