C#でダブルクォーテーションを文字列に含める方法|エスケープ・逐語的文字列・補間文字列まで解説
はじめに
C#で文字列を扱っていると、文字列の中にダブルクォーテーションを入れたい場面がよくあります。
たとえば、次のような文字列を出力したいケースです。
C#彼は "Hello" と言いました。
しかし、C#ではダブルクォーテーション " が文字列の開始と終了を表す記号として使われるため、そのまま文字列内に書くとコンパイルエラーになります。
C#string message = "彼は "Hello" と言いました。";
このように書くと、C#はどこまでが文字列なのか判断できません。
この記事では、C#でダブルクォーテーションを文字列に含める方法を、通常の文字列、逐語的文字列、補間文字列、raw文字列リテラルまでまとめて解説します。JSON、CSV、HTML、コマンドライン引数など、実務でよく使う例も紹介します。
1. C#でダブルクォーテーションを文字列に含める結論
C#でダブルクォーテーションを文字列に含める方法は、主に次の4つです。
通常の文字列では \" のようにバックスラッシュでエスケープします。逐語的文字列では "" のようにダブルクォーテーションを2つ重ねます。補間文字列では、基本的に通常文字列と同じく \" を使います。C# 11以降では、raw文字列リテラルを使うことで、ダブルクォーテーションをエスケープせずに書ける場合があります。
1-1. 通常の文字列では「"」でエスケープする
通常の文字列リテラルでは、ダブルクォーテーションの前にバックスラッシュ \ を付けます。
C#string text = "彼は \"Hello\" と言いました。";
Console.WriteLine(text);
出力結果は次のとおりです。
彼は "Hello" と言いました。
C#では \" と書くことで、ダブルクォーテーションを文字列の終了記号ではなく、文字として扱えます。
1-2. 逐語的文字列では「""」のように2つ重ねる
逐語的文字列リテラルは、文字列の前に @ を付けて書きます。
C#string text = @"彼は ""Hello"" と言いました。";
Console.WriteLine(text);
出力結果は次のとおりです。
彼は "Hello" と言いました。
@付きの文字列では、バックスラッシュによるエスケープではなく、ダブルクォーテーションを2つ重ねて表現します。
1-3. 補間文字列でも基本は通常文字列と同じく「"」を使う
補間文字列は、文字列の中に変数や式を埋め込める書き方です。
C#string name = "田中";
string text = $"{name}さんは \"OK\" と言いました。";
Console.WriteLine(text);
出力結果は次のとおりです。
田中さんは "OK" と言いました。
$"..." の中でダブルクォーテーションを文字として使いたい場合も、通常文字列と同じように \" を使います。
1-4. 用途別の書き方早見表
C#でダブルクォーテーションを含める書き方を整理すると、次のようになります。
| 用途 | 書き方 | 例 |
|---|---|---|
| 通常の文字列 | \" | "\"Hello\"" |
| 逐語的文字列 | "" | @"""Hello""" |
| 補間文字列 | \" | $"\"{name}\"" |
| 補間逐語的文字列 | "" | $@"""{name}""" |
| raw文字列リテラル | エスケープ不要な場合あり | """ "Hello" """ |
基本的には、短い文字列なら \"、ファイルパスや複数行文字列なら @、JSONや複雑な複数行文字列なら raw文字列リテラルを検討するとよいでしょう。
2. なぜC#では文字列内のダブルクォーテーションでエラーになるのか
C#でダブルクォーテーションをそのまま文字列内に書くとエラーになる理由は、ダブルクォーテーション自体が文字列リテラルの区切りとして使われるためです。
2-1. ダブルクォーテーションは文字列の開始・終了を表す記号
C#の文字列は、通常次のようにダブルクォーテーションで囲んで書きます。
C#string text = "Hello";
この場合、最初の " が文字列の開始、最後の " が文字列の終了を表します。
そのため、文字列の中に何の処理もせず " を書くと、C#コンパイラはそこで文字列が終わったと判断します。
2-2. そのまま書くとコンパイルエラーになる例
たとえば、次のコードはエラーになります。
C#string text = "彼は "Hello" と言いました。";
C#から見ると、次のように文字列が途中で分断されているように解釈されます。
C#"彼は " Hello " と言いました。"
Hello の部分が文字列の外に出てしまうため、構文として正しくありません。
このような場合は、次のように書く必要があります。
C#string text = "彼は \"Hello\" と言いました。";
2-3. ダブルクォーテーションを「文字」として扱う必要があるケース
C#でダブルクォーテーションを文字として扱う場面は多くあります。
たとえば、JSON文字列を作るときはキーや値をダブルクォーテーションで囲みます。
JSON{"name":"Taro"}
CSVでは、値にカンマや改行を含む場合にダブルクォーテーションで囲むことがあります。
csv"Tanaka","Tokyo, Japan"
HTML属性を書くときにも、属性値をダブルクォーテーションで囲むことがあります。
HTML<a href="https://example.com">link</a>
このような文字列をC#コード内で直接書く場合、ダブルクォーテーションを正しく表現する必要があります。
3. 通常の文字列でダブルクォーテーションを含める方法
通常の文字列でダブルクォーテーションを含める場合は、バックスラッシュを使ったエスケープが基本です。
3-1. バックスラッシュでエスケープする基本構文
C#の通常文字列では、ダブルクォーテーションを次のように書きます。
C#\"
たとえば、"Hello" という文字列を作りたい場合は、次のように書きます。
C#string text = "\"Hello\"";
最初と最後の " は文字列リテラルの区切りです。中にある \" が、文字としてのダブルクォーテーションになります。
3-2. Console.WriteLineで出力するサンプルコード
実際に Console.WriteLine で出力してみます。
C#string text = "C#では \" をエスケープして書きます。";
Console.WriteLine(text);
出力結果は次のとおりです。
C#では " をエスケープして書きます。
\" と書いても、出力時にはバックスラッシュは表示されません。バックスラッシュは、あくまでC#のコード上でダブルクォーテーションを文字として扱うための記号です。
3-3. 文字列の前後にダブルクォーテーションを付ける方法
文字列全体をダブルクォーテーションで囲んで出力したい場合は、前後に \" を付けます。
C#string word = "Hello";
string quoted = "\"" + word + "\"";
Console.WriteLine(quoted);
出力結果は次のとおりです。
"Hello"
補間文字列を使うと、より読みやすく書けます。
C#string word = "Hello";
string quoted = $"\"{word}\"";
Console.WriteLine(quoted);
この書き方は、ログ出力やCSV生成などでよく使います。
3-4. 複数のダブルクォーテーションを含む文字列の書き方
文字列の中に複数のダブルクォーテーションを含める場合も、必要な箇所に \" を書きます。
C#string text = "彼は \"はい\" と言い、彼女は \"いいえ\" と答えました。";
Console.WriteLine(text);
出力結果は次のとおりです。
彼は "はい" と言い、彼女は "いいえ" と答えました。
ただし、ダブルクォーテーションが多い文字列では \" が増えて読みにくくなります。その場合は、逐語的文字列やraw文字列リテラルを使うと見やすくなることがあります。
3-5. よく使うエスケープシーケンス一覧
C#の通常文字列では、ダブルクォーテーション以外にもさまざまなエスケープシーケンスがあります。
| エスケープシーケンス | 意味 |
|---|---|
\" | ダブルクォーテーション |
\\ | バックスラッシュ |
\n | 改行 |
\r | キャリッジリターン |
\t | タブ |
\' | シングルクォーテーション |
\0 | null文字 |
たとえば、改行を含む文字列は次のように書けます。
C#string text = "1行目\n2行目";
Console.WriteLine(text);
出力結果は次のとおりです。
1行目
2行目
バックスラッシュ自体を表示したい場合は、\\ と書きます。
C#string path = "C:\\Users\\Taro\\Documents";
Console.WriteLine(path);
4. 逐語的文字列リテラルでダブルクォーテーションを含める方法
ダブルクォーテーションやバックスラッシュが多い文字列では、逐語的文字列リテラルを使うと便利です。
4-1. 逐語的文字列リテラルとは
逐語的文字列リテラルとは、文字列の前に @ を付ける書き方です。
C#string text = @"C:\Users\Taro\Documents";
通常文字列ではバックスラッシュを \\ と書く必要がありますが、逐語的文字列ではそのまま書けます。
C#string normal = "C:\\Users\\Taro\\Documents";
string verbatim = @"C:\Users\Taro\Documents";
どちらも同じ文字列になります。
4-2. @付き文字列ではダブルクォーテーションを2つ重ねる
逐語的文字列リテラルでは、ダブルクォーテーションを \" ではなく "" と書きます。
C#string text = @"彼は ""Hello"" と言いました。";
Console.WriteLine(text);
出力結果は次のとおりです。
彼は "Hello" と言いました。
@付き文字列の中では、バックスラッシュは特別な意味を持ちにくくなります。そのため、\" と書いても通常文字列のようには扱われません。
4-3. ファイルパスや複数行文字列で便利な理由
逐語的文字列は、ファイルパスを書くときに特に便利です。
C#string path = @"C:\Users\Taro\Documents\sample.txt";
通常文字列で書くと、次のようにバックスラッシュをすべてエスケープする必要があります。
C#string path = "C:\\Users\\Taro\\Documents\\sample.txt";
また、逐語的文字列では複数行の文字列もそのまま書けます。
C#string text = @"1行目
2行目
3行目";
Console.WriteLine(text);
出力結果は次のとおりです。
1行目
2行目
3行目
複数行のSQL、テンプレート文字列、テスト用データなどを書くときに便利です。
4-4. 通常文字列との違いと使い分け
通常文字列と逐語的文字列の違いは、主にエスケープの扱いです。
通常文字列では、改行やタブを \n、\t のように書けます。
C#string text = "1行目\n2行目";
逐語的文字列では、\n と書いても改行ではなく、バックスラッシュと n の2文字として扱われます。
C#string text = @"1行目\n2行目";
Console.WriteLine(text);
出力結果は次のとおりです。
1行目\n2行目
そのため、短い文字列やエスケープシーケンスを使いたい場合は通常文字列、ファイルパスや複数行文字列では逐語的文字列が向いています。
4-5. 逐語的文字列でよくある書き間違い
逐語的文字列でよくあるミスは、通常文字列と同じように \" と書いてしまうことです。
C#string text = @"彼は \"Hello\" と言いました。";
この書き方は意図した結果になりません。逐語的文字列では、次のように "" を使います。
C#string text = @"彼は ""Hello"" と言いました。";
また、逐語的文字列の末尾にバックスラッシュがあっても、通常文字列のように問題になるわけではありません。
C#string path = @"C:\Temp\";
このようにファイルパスを自然に書けるのが逐語的文字列のメリットです。
5. 補間文字列でダブルクォーテーションを含める方法
補間文字列を使うと、変数や式を文字列内に埋め込めます。ダブルクォーテーションを含める場合も、基本は通常文字列と同じです。
5-1. 補間文字列とは
補間文字列とは、文字列の前に $ を付ける書き方です。
C#string name = "田中";
string text = $"こんにちは、{name}さん";
Console.WriteLine(text);
出力結果は次のとおりです。
こんにちは、田中さん
{} の中に変数や式を書くことで、値を文字列に埋め込めます。
5-2. $"..."内でダブルクォーテーションを使う書き方
$"..." の中でダブルクォーテーションを使いたい場合は、\" と書きます。
C#string name = "田中";
string text = $"{name}さんは \"承認\" をクリックしました。";
Console.WriteLine(text);
出力結果は次のとおりです。
田中さんは "承認" をクリックしました。
補間文字列であっても、文字列全体を囲むダブルクォーテーションのルールは通常文字列と同じです。
5-3. 変数の値をダブルクォーテーションで囲んで出力する方法
変数の値をダブルクォーテーションで囲みたい場合は、次のように書きます。
C#string value = "Tokyo";
string text = $"値は \"{value}\" です。";
Console.WriteLine(text);
出力結果は次のとおりです。
値は "Tokyo" です。
ログ出力では、空文字や前後の空白を見分けやすくするために、値をダブルクォーテーションで囲むことがあります。
C#string input = " test ";
Console.WriteLine($"input=\"{input}\"");
出力結果は次のとおりです。
input=" test "
5-4. 補間逐語的文字列 $@"..."・@$"..." の書き方
補間文字列と逐語的文字列は組み合わせて使えます。
C#string name = "sample.txt";
string path = $@"C:\Temp\{name}";
Console.WriteLine(path);
出力結果は次のとおりです。
C:\Temp\sample.txt
$@ と @$ はどちらも使用できます。
C#string text1 = $@"ファイル名は ""{name}"" です。";
string text2 = @$"ファイル名は ""{name}"" です。";
どちらも同じ意味です。
補間逐語的文字列では、ダブルクォーテーションは逐語的文字列と同じく "" と書きます。
C#string name = "sample.txt";
string text = $@"ファイル名は ""{name}"" です。";
Console.WriteLine(text);
出力結果は次のとおりです。
ファイル名は "sample.txt" です。
5-5. 中括弧とダブルクォーテーションを同時に扱う場合の注意点
補間文字列では {} が変数や式の埋め込みに使われます。そのため、文字としての中括弧を出力したい場合は、{{ や }} のように2つ重ねます。
C#string name = "Taro";
string text = $"{{ \"name\": \"{name}\" }}";
Console.WriteLine(text);
出力結果は次のとおりです。
{ "name": "Taro" }
この例では、JSONの { と } を文字として出力するために {{ と }} を使い、ダブルクォーテーションは \" でエスケープしています。
ただし、JSON文字列を手作業で組み立てると、エスケープ漏れや不正な形式になりやすいため、実務では System.Text.Json などを使ってシリアライズする方法も検討してください。
6. 実務でよく使うダブルクォーテーションの書き方例
ここでは、実務でよく登場するダブルクォーテーションの扱い方を紹介します。
6-1. JSON文字列にダブルクォーテーションを含める
JSONでは、キーや文字列値をダブルクォーテーションで囲みます。
通常文字列でJSONを書く場合は、ダブルクォーテーションをすべて \" としてエスケープします。
C#string json = "{\"name\":\"Taro\",\"age\":30}";
Console.WriteLine(json);
出力結果は次のとおりです。
JSON{"name":"Taro","age":30}
複数行のJSONを書く場合は、逐語的文字列を使うと少し読みやすくなります。
C#string json = @"{
""name"": ""Taro"",
""age"": 30
}";
さらにC# 11以降であれば、raw文字列リテラルを使うとより自然に書けます。
C#string json = """
{
"name": "Taro",
"age": 30
}
""";
ただし、実務でオブジェクトをJSONに変換する場合は、文字列を手で組み立てるよりもシリアライザーを使う方が安全です。
C#using System.Text.Json;
var user = new { Name = "Taro", Age = 30 };
string json = JsonSerializer.Serialize(user);
Console.WriteLine(json);
6-2. CSVの値をダブルクォーテーションで囲む
CSVでは、値にカンマ、改行、ダブルクォーテーションが含まれる場合、値をダブルクォーテーションで囲むことがあります。
単純に値を囲むだけなら、次のように書けます。
C#string name = "Tanaka";
string csv = $"\"{name}\"";
Console.WriteLine(csv);
出力結果は次のとおりです。
csv"Tanaka"
複数の値をCSV形式にする例です。
C#string name = "Tanaka";
string address = "Tokyo, Japan";
string csv = $"\"{name}\",\"{address}\"";
Console.WriteLine(csv);
出力結果は次のとおりです。
csv"Tanaka","Tokyo, Japan"
値の中にダブルクォーテーションが含まれる場合は、CSVのルールに従ってダブルクォーテーションを2つにする必要があります。
C#string value = "He said \"Hello\"";
string escaped = value.Replace("\"", "\"\"");
string csvValue = $"\"{escaped}\"";
Console.WriteLine(csvValue);
出力結果は次のとおりです。
csv"He said ""Hello"""
6-3. HTML属性を含む文字列を書く
HTML属性では、属性値をダブルクォーテーションで囲むことがあります。
C#string html = "<a href=\"https://example.com\">Example</a>";
Console.WriteLine(html);
出力結果は次のとおりです。
HTML<a href="https://example.com">Example</a>
逐語的文字列で書く場合は、ダブルクォーテーションを2つ重ねます。
C#string html = @"<a href=""https://example.com"">Example</a>";
C# 11以降なら、raw文字列リテラルを使うとさらに読みやすくなります。
C#string html = """
<a href="https://example.com">Example</a>
""";
HTMLをC#文字列として直接書く場合は、ダブルクォーテーションのエスケープだけでなく、ユーザー入力を埋め込む際のHTMLエスケープにも注意が必要です。
6-4. コマンドライン引数をダブルクォーテーションで囲む
コマンドライン引数では、スペースを含むパスをダブルクォーテーションで囲むことがあります。
C#string path = @"C:\My Folder\sample.txt";
string argument = $"\"{path}\"";
Console.WriteLine(argument);
出力結果は次のとおりです。
"C:\My Folder\sample.txt"
コマンド全体を作る例です。
C#string exePath = @"C:\Tools\app.exe";
string filePath = @"C:\My Folder\sample.txt";
string command = $"\"{exePath}\" \"{filePath}\"";
Console.WriteLine(command);
出力結果は次のとおりです。
"C:\Tools\app.exe" "C:\My Folder\sample.txt"
ただし、外部プロセスを起動する場合は、可能であれば文字列結合でコマンドライン全体を組み立てるより、ProcessStartInfo の引数指定機能を使う方が安全です。
6-5. ログ出力で文字列を見やすく囲む
ログでは、値の範囲を分かりやすくするためにダブルクォーテーションで囲むことがあります。
C#string userName = "Taro";
string status = "Active";
Console.WriteLine($"userName=\"{userName}\", status=\"{status}\"");
出力結果は次のとおりです。
userName="Taro", status="Active"
前後に空白がある値や空文字を確認するときにも便利です。
C#string input = " abc ";
Console.WriteLine($"input=\"{input}\"");
出力結果は次のとおりです。
input=" abc "
ダブルクォーテーションで囲むことで、ログを見たときに値の始まりと終わりが分かりやすくなります。
7. C# 11以降のraw文字列リテラルで書く方法
C# 11以降では、raw文字列リテラルを使って文字列をより直感的に書けます。特にJSON、HTML、SQL、複数行テキストのように、ダブルクォーテーションや改行を多く含む文字列で便利です。
7-1. raw文字列リテラルとは
raw文字列リテラルは、3つ以上のダブルクォーテーションで囲んで書く文字列リテラルです。
C#string text = """
Hello
""";
複数行の文字列をそのまま書けます。
C#string text = """
1行目
2行目
3行目
""";
Console.WriteLine(text);
出力結果は次のとおりです。
1行目
2行目
3行目
raw文字列リテラルでは、通常の文字列や逐語的文字列よりもエスケープを減らせる場面があります。
7-2. ダブルクォーテーションをエスケープせずに書けるケース
raw文字列リテラルでは、文字列の中にダブルクォーテーションをそのまま書けます。
C#string text = """
彼は "Hello" と言いました。
""";
Console.WriteLine(text);
出力結果は次のとおりです。
彼は "Hello" と言いました。
通常文字列のように \" と書く必要はありません。
ただし、文字列内に連続するダブルクォーテーションが多く含まれる場合は、外側の区切りに使うダブルクォーテーションの数を増やします。
C#string text = """""
ここには """ が含まれます。
""""";
raw文字列リテラルは、外側の区切りより少ない数の連続ダブルクォーテーションを文字列内に含められます。
7-3. JSONや複数行文字列での活用例
raw文字列リテラルは、JSONを書くときに非常に便利です。
C#string json = """
{
"name": "Taro",
"age": 30,
"city": "Tokyo"
}
""";
Console.WriteLine(json);
通常文字列で同じJSONを書くと、ダブルクォーテーションを何度もエスケープする必要があります。
C#string json = "{ \"name\": \"Taro\", \"age\": 30, \"city\": \"Tokyo\" }";
raw文字列リテラルを使うと、JSONの見た目に近い形でコードに書けるため、読みやすく保守しやすくなります。
補間も組み合わせられます。
C#string name = "Taro";
int age = 30;
string json = $$"""
{
"name": "{{name}}",
"age": {{age}}
}
""";
raw補間文字列では、$ の数に応じて、補間に必要な {} の数が変わります。上の例では $$""" を使っているため、{{name}} のように2重の中括弧で補間しています。
7-4. raw文字列リテラルを使う際の注意点
raw文字列リテラルは便利ですが、すべての場面で使う必要はありません。
短い文字列では、通常文字列の方が簡潔です。
C#string text = "Hello";
一方、JSONやHTMLのようにダブルクォーテーションが多い文字列では、raw文字列リテラルの方が読みやすくなります。
また、raw文字列リテラルはC# 11以降の機能です。古いC#バージョンや古いプロジェクトでは使えない場合があります。利用する場合は、プロジェクトの言語バージョンを確認してください。
8. ダブルクォーテーションを扱うときのよくあるエラーと対処法
C#でダブルクォーテーションを扱うときは、書き方の違いによるミスがよく発生します。ここでは代表的なエラーと対処法を紹介します。
8-1. 「; が必要です」などのコンパイルエラーが出る原因
次のように、文字列内のダブルクォーテーションをエスケープし忘れると、コンパイルエラーになります。
C#string text = "彼は "Hello" と言いました。";
C#コンパイラは、"彼は " の部分で文字列が終了したと判断します。その後に Hello が続くため、構文エラーになります。
正しくは次のように書きます。
C#string text = "彼は \"Hello\" と言いました。";
エラー内容としては、「; が必要です」「無効な式です」など、ダブルクォーテーションそのものとは違うメッセージが表示されることもあります。その場合でも、文字列の途中にエスケープしていない " がないか確認しましょう。
8-2. バックスラッシュと円記号の見え方の違い
日本語環境では、バックスラッシュ \ が円記号 ¥ のように表示されることがあります。
たとえば、コード上で次のように見える場合があります。
C#string text = "彼は ¥"Hello¥" と言いました。";
環境によって表示が異なるだけで、意味としてはバックスラッシュと同じ場合があります。
C#でダブルクォーテーションをエスケープする場合は、半角のバックスラッシュを使います。
C#string text = "彼は \"Hello\" と言いました。";
見た目が ¥ になっていても、文字コード上はバックスラッシュとして扱われていることがあります。エディタやフォントによる表示の違いとして理解しておくと混乱しにくくなります。
8-3. 逐語的文字列で " と書いてしまうミス
逐語的文字列では、ダブルクォーテーションを \" ではなく "" と書きます。
間違った例です。
C#string text = @"彼は "Hello" と言いました。";
このコードは、文字列が途中で終了したと解釈されるためエラーになります。
正しくは次のように書きます。
C#string text = @"彼は ""Hello"" と言いました。";
逐語的文字列では、ダブルクォーテーションを2つ重ねる、と覚えておきましょう。
8-4. 補間文字列で中括弧のエスケープを忘れるミス
補間文字列では、{} が変数や式の埋め込みに使われます。そのため、JSONのように中括弧を文字として出力したい場合は注意が必要です。
間違った例です。
C#string name = "Taro";
string json = $"{"name": "{name}"}";
このコードは、C#が {} を補間式として解釈しようとするため、正しく書けません。
通常の補間文字列でJSON風の文字列を書くなら、次のように中括弧を {{ と }} にします。
C#string name = "Taro";
string json = $"{{ \"name\": \"{name}\" }}";
Console.WriteLine(json);
出力結果は次のとおりです。
JSON{ "name": "Taro" }
ダブルクォーテーションだけでなく、中括弧のエスケープも必要になる点に注意しましょう。
8-5. 文字列結合が複雑になりすぎる場合の改善方法
ダブルクォーテーションを含む文字列を + で結合していくと、コードが読みにくくなることがあります。
C#string name = "Taro";
string json = "{ \"name\": \"" + name + "\" }";
この程度なら問題ありませんが、項目が増えるとエスケープや結合が複雑になります。
補間文字列を使うと、少し読みやすくなります。
C#string name = "Taro";
string json = $"{{ \"name\": \"{name}\" }}";
C# 11以降なら、raw補間文字列も選択肢になります。
C#string name = "Taro";
string json = $$"""
{
"name": "{{name}}"
}
""";
さらに、JSONを生成する目的であれば、文字列結合ではなく JsonSerializer.Serialize を使う方が安全です。
C#using System.Text.Json;
var user = new { name = "Taro" };
string json = JsonSerializer.Serialize(user);
目的に応じて、通常文字列、補間文字列、raw文字列リテラル、専用ライブラリを使い分けることが大切です。
9. ダブルクォーテーションを削除・置換する方法
ここまでは、C#の文字列にダブルクォーテーションを含める方法を解説しました。次に、すでに含まれているダブルクォーテーションを削除したり、別の文字に置換したりする方法を紹介します。
9-1. Replaceでダブルクォーテーションを削除する
文字列内のダブルクォーテーションをすべて削除するには、Replace を使います。
C#string text = "彼は \"Hello\" と言いました。";
string result = text.Replace("\"", "");
Console.WriteLine(result);
出力結果は次のとおりです。
彼は Hello と言いました。
Replace("\"", "") は、ダブルクォーテーションを空文字に置き換えるという意味です。
文字列ではなく char として指定することもできます。
C#string result = text.Replace("\"", "");
ダブルクォーテーションを削除したいだけなら、この書き方で十分です。
9-2. Replaceで別の文字に置換する
ダブルクォーテーションを別の文字に置換したい場合も Replace を使います。
たとえば、ダブルクォーテーションをシングルクォーテーションに置き換える例です。
C#string text = "彼は \"Hello\" と言いました。";
string result = text.Replace("\"", "'");
Console.WriteLine(result);
出力結果は次のとおりです。
彼は 'Hello' と言いました。
CSV用に、値の中のダブルクォーテーションを2つに増やしたい場合は、次のように書きます。
C#string value = "He said \"Hello\"";
string escaped = value.Replace("\"", "\"\"");
Console.WriteLine(escaped);
出力結果は次のとおりです。
He said ""Hello""
この処理は、CSVの値を安全に出力するときによく使います。
9-3. Trimで前後のダブルクォーテーションだけを取り除く
文字列の前後にあるダブルクォーテーションだけを取り除きたい場合は、Trim を使えます。
C#string text = "\"Hello\"";
string result = text.Trim('"');
Console.WriteLine(result);
出力結果は次のとおりです。
Hello
Replace は文字列内のすべてのダブルクォーテーションを対象にしますが、Trim は前後の文字だけを対象にします。
たとえば、次のような文字列では違いが出ます。
C#string text = "\"He said \"Hello\"\"";
string replaced = text.Replace("\"", "");
string trimmed = text.Trim('"');
Console.WriteLine(replaced);
Console.WriteLine(trimmed);
Replace はすべて削除しますが、Trim は前後のダブルクォーテーションだけを削除します。
前後だけ削除したい場合は Trim('"')、すべて削除したい場合は Replace("\"", "") を使いましょう。
9-4. 入力値やCSV読み込み時の注意点
ユーザー入力やCSVファイルから読み込んだ文字列には、想定外の位置にダブルクォーテーションが含まれていることがあります。
たとえば、CSVでは次のような値があり得ます。
csv"Tanaka","He said ""Hello"""
この場合、CSV上の "" は、値の中の " を表します。
単純に Replace("\"", "") で削除すると、本来必要なダブルクォーテーションまで消してしまう可能性があります。
CSVを正しく扱うには、CSVの仕様に対応したライブラリやパーサーを使うのが安全です。特に、カンマ、改行、ダブルクォーテーションを含む値を扱う場合は、単純な Split(',') だけでは正しく処理できないことがあります。
入力値を処理するときは、次のように目的を分けて考えることが重要です。
| 目的 | 使用例 |
|---|---|
| すべてのダブルクォーテーションを削除したい | Replace("\"", "") |
| ダブルクォーテーションを別の文字にしたい | Replace("\"", "'") |
| 前後のダブルクォーテーションだけ削除したい | Trim('"') |
| CSVとして正しく読みたい | CSVパーサーを使う |
| JSONとして正しく読みたい | JSONシリアライザーを使う |
ダブルクォーテーションは単なる記号として削除すればよい場合もありますが、CSVやJSONのように構造上の意味を持つ場合もあります。データ形式に応じた処理を選びましょう。
まとめ
C#でダブルクォーテーションを文字列に含めるには、文字列リテラルの種類に応じて書き方を変える必要があります。
通常の文字列では、ダブルクォーテーションを \" と書きます。
C#string text = "彼は \"Hello\" と言いました。";
逐語的文字列では、ダブルクォーテーションを "" と2つ重ねます。
C#string text = @"彼は ""Hello"" と言いました。";
補間文字列では、通常文字列と同じように \" を使います。
C#string name = "Taro";
string text = $"名前は \"{name}\" です。";
補間逐語的文字列では、逐語的文字列と同じく "" を使います。
C#string name = "Taro";
string text = $@"名前は ""{name}"" です。";
C# 11以降では、raw文字列リテラルを使うことで、JSONやHTMLのようなダブルクォーテーションを多く含む文字列を読みやすく書けます。
C#string json = """
{
"name": "Taro",
"age": 30
}
""";
短い文字列なら通常文字列、ファイルパスや複数行文字列なら逐語的文字列、変数を埋め込みたいなら補間文字列、JSONやHTMLのような複雑な文字列ならraw文字列リテラルを使うとよいでしょう。
ダブルクォーテーションの扱いは、C#の文字列操作で頻繁に登場する基本です。\"、""、raw文字列リテラルの違いを理解しておくことで、コンパイルエラーを防ぎ、読みやすいコードを書けるようになります。

