C#で文字列を扱う際に避けて通れないのが「エスケープ文字」の知識です。特に改行コード(\nや\r\n)は、環境によって見え方や動作が異なるため、初心者の方にとって混乱の元になることがあります。この記事では、C#における代表的なエスケープ文字の使い方と、改行コードの違いや注意点について、実例を交えて丁寧に解説します。WindowsとUNIXでの扱いの違いや、@を使った逐語的文字列など、実務に役立つ情報も満載です。
C#におけるエスケープ文字とは
エスケープ文字とは、特殊な意味を持つ文字列を記述するための書き方です。通常の文字列に埋め込むことで、改行やタブ、バックスラッシュなど、文字列内でそのまま書けない文字を表現することができます。
C#では、エスケープ文字はバックスラッシュ(\)から始まる記号で表されます。例えば次のようなものがあります:
| エスケープ文字 | 意味 |
|---|---|
\n | 改行(LF) |
\r | 復帰(CR) |
\r\n | 改行+復帰(CRLF) |
\t | タブ |
\\ | バックスラッシュ |
\" | ダブルクォーテーション |
\' | シングルクォーテーション |
\0 | null文字(\0) |
特に注意したいのは、改行の表現(\nや\r\n)です。OSやアプリケーションによって扱いが異なります。
改行コードの違い(\n vs \r\n)
C#で改行を表す際には、\n(ラインフィード)や\r\n(キャリッジリターン+ラインフィード)を使いますが、実際には以下のような違いがあります:
- Windows:
\r\nを使用(CRLF) - UNIX/Linux/macOS:
\nを使用(LF) - 旧Mac(Mac OS 9以前):
\rを使用(CR)
C#の文字列において、\nや\r\nをそのまま記述することで、対応する改行が入ります。たとえば:
Console.WriteLine("1行目\n2行目");
これは、以下のように表示されます:
1行目
2行目
一方、Windows環境でファイルに出力する場合など、\r\nを使う方が適切なケースもあります。例:
File.WriteAllText("output.txt", "1行目\r\n2行目");
このように用途によって適切な改行コードを使い分ける必要があります。
逐語的文字列(@)を使った改行の扱い
C#では、@を使って文字列をそのまま書ける「逐語的文字列(Verbatim String)」という書き方があります。たとえば:
string multiLine = @"これは
複数行の
文字列です。";
この書き方では、\nや\tといったエスケープシーケンスは無効化され、文字通りの文字列として扱われます。よって、改行を含む文字列も、ソースコード上で改行すればそのまま適用されます。
ただし、ダブルクォーテーション(")を使いたい場合は "" と2つ重ねて書く必要があります。
string s = @"これは ""サンプル"" です";
StringBuilderを使った改行の追加方法
長い文字列を効率的に連結したいときには StringBuilder クラスが便利です。改行を含めたいときは、AppendLine メソッドを使うと自動で環境に応じた改行コードを追加してくれます。
using System.Text;
StringBuilder sb = new StringBuilder();
sb.AppendLine("1行目");
sb.AppendLine("2行目");
string result = sb.ToString();
Console.WriteLine(result);
このように、明示的に \n を書かなくても、自動的に適切な改行が入ります。
改行を含む文字列をファイル出力する
C#では、ファイル出力時に改行を含む文字列を出力することも一般的です。以下のように記述します:
string content = "これは1行目です。\nこれは2行目です。";
File.WriteAllText("output.txt", content);
このとき、output.txt をメモ帳などで開いたときに、うまく改行されない場合は \r\n に置き換えると改善することがあります:
string content = "これは1行目です。\r\nこれは2行目です。";
または、Environment.NewLine を使うと、環境に依存した改行コードを自動で挿入できます。
string content = "これは1行目です。" + Environment.NewLine + "これは2行目です。";
文字列の整形と改行を組み合わせる例
以下は、エスケープ文字と改行を活用した文字列の整形の例です:
string name = "山田太郎";
int age = 30;
string message = $"お名前:{name}\n年齢:{age}\nご利用ありがとうございます。";
Console.WriteLine(message);
出力は次のようになります:
お名前:山田太郎
年齢:30
ご利用ありがとうございます。
改行を使うことで、画面表示もわかりやすくなります。
注意点:改行コードの変換
他のシステムと連携する際に、改行コードが原因で不具合が生じることもあります。たとえば、UNIX形式の改行コード(\n)を使用しているテキストをWindowsで開いた場合、1行にすべてが表示されることがあります。
このような場合、C#では以下のように正規表現を使って変換可能です:
string unixText = "行1\n行2\n行3";
string windowsText = unixText.Replace("\n", "\r\n");
もしくは Regex クラスを使ってより柔軟な置換を行うことも可能です。
まとめ
C#におけるエスケープ文字、特に改行コードは、ちょっとした違いが思わぬバグを引き起こすこともある重要なポイントです。改行コードの違いを正しく理解し、環境に応じて使い分けることが、より堅牢なプログラム作成につながります。
最後に、改行を扱う際に役立つポイントをまとめます:
\nはLF(主にUNIX系)\r\nはCRLF(主にWindows)@で始まる逐語的文字列ではエスケープが不要StringBuilder.AppendLine()やEnvironment.NewLineで環境に応じた改行を使う- ファイル入出力時は改行コードに注意
この記事が、C#の文字列操作における正確な改行処理に役立てば幸いです。
