演習 - 文字エスケープ シーケンスを使用して文字列を結合する

完了

あなたは、英語と日本語の両方で請求書を生成するコマンドライン ツールの見本を作成するように頼まれたとします。 請求書を生成する機能を実際に作成する必要はまだありません。 必要なのは、承認を得るために請求部署の社内顧客にコマンド ライン インターフェイスを提供することだけです。 上司からは、書式設定を加え、ツールの現在の進捗状況をはっきりさせるように依頼されました。 また、上司からは、請求書を日本語で生成する方法について日本のユーザー向けの指示を提供するように求められました。

演習 - C# でリテラル文字列の書式を設定する

この演習では、特殊文字を表示し、出力にさまざまな種類の書式設定を追加する、いろいろな手法を学習します。

文字エスケープ シーケンス

エスケープ文字シーケンスは、文字列の出力に影響を与える特殊文字を挿入するようランタイムに指示します。 C# では、エスケープ文字シーケンスは円記号 \ で始まり、その後にエスケープする文字が続きます。 たとえば、\n シーケンスの場合、改行が追加され、\t シーケンスの場合、タブが追加されます。

次のコードでは、エスケープ文字シーケンスを使って、改行とタブを追加します。

Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");

このコードを実行すると、次の出力が表示されます。

Hello
World!
Hello   World!

リテラル文字列に二重引用符を挿入する必要がある場合、どうすればよいですか? 文字エスケープ シーケンスを使わないと、コンパイラはユーザーが文字列を途中で終了しようとしていると考えて混乱します。 また、コンパイラには 2 つ目の二重引用符の後にある文字の目的がわかりません。

Console.WriteLine("Hello "World"!");

.NET エディターの場合、World の下に赤い波線が付きます。 しかし、とにかくコードを実行してみた場合、次のような出力が表示されます。

(1,27): error CS1003: Syntax error, ',' expected
(1,27): error CS0103: The name 'World' does not exist in the current context
(1,32): error CS1003: Syntax error, ',' expected

このような状況に対処するには、\" エスケープ シーケンスを使います。

Console.WriteLine("Hello \"World\"!");

上のコードを実行すると、次の出力が表示されます。

Hello "World"!

ファイル パスを表示するなど、他の目的でバックスラッシュを使用する必要がある場合、どうすればよいですか?

Console.WriteLine("c:\source\repos");

残念なことに C# ではバックスラッシュがエスケープ シーケンスとして予約されており、このコードを実行すると、コンパイラには次のエラーが表示されます。

(1,22): error CS1009: Unrecognized escape sequence

問題はシーケンス \s にあります。 \r を使うと、復帰の有効なエスケープ シーケンスであるため、エラーにはなりません。 しかし、このコンテキストでは復帰を使いたくありません。

この問題を解決するには、\\ を使って、円記号を 1 つ表示します。

Console.WriteLine("c:\\source\\repos");

円記号文字をエスケープすることで、目的の出力が生成されます。

c:\source\repos

文字エスケープ シーケンスを使用して出力を書式設定する

  1. .NET エディターですべてのコードを選択し、Delete または Backspace キーを押して削除します。

  2. コマンド ライン ツールのモックアップを作成するため、エディターに次のコードを入力します。

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    
  3. 次にコードを実行します。 出力コンソールに次の結果が表示されます。

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:    
    

逐語的文字列リテラル

逐語的文字列リテラルでは、バックスラッシュをエスケープしなくてもすべての空白と文字が維持されます。 逐語的文字列を作成するには、リテラル文字列の前に @ ディレクティブを使用します。

Console.WriteLine(@"    c:\source\repos    
        (this is where your code goes)");

文字列が 2 行にまたがり、この C# 命令で生成される空白が次の出力で維持されることに注目してください。

    c:\source\repos    
        (this is where your code goes)

逐語的文字列リテラルを使用して出力を書式設定する

  1. 前に作成したコードの下に、次のコード行を追加します。

    Console.Write(@"c:\invoices");
    
  2. 次にコードを実行します。 "Output Directory" を含む次の結果が表示されます。

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:
    c:\invoices
    

Unicode のエスケープ文字

\u エスケープ シーケンスに Unicode (UTF-16) の文字を表す 4 文字コードを続ける方法で、エンコードした文字をリテラル文字列に追加することもできます。

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

Note

これには注意点がいくつかあります。 まず、Windows コマンド プロンプトなど、一部のコンソールでは一部の Unicode 文字が表示されません。 表示されない文字の代わりに疑問符文字が表示されます。 また、この例で使用されているのは UTF-16 です。 一部の文字には UTF-32 が必要であり、別のエスケープ シーケンスが必要になります。 それは複雑な題目です。このモジュールは、可能なことは何かを示すことだけを目的としています。 必要であれば、相当な時間がかかるかもしれませんが、Unicode 文字について学習し、ご自分のアプリケーションで使用してみてください。

Unicode のエスケープ文字を使用して出力を書式設定する

コマンド ライン ツールのモックアップを完成させるため、日本語で "日本語の請求書を生成するには" という語句を追加します。 次に、ユーザーが入力できるコマンドを表す逐語的リテラル文字列を表示します。 書式設定のためのエスケープ シーケンスもいくつか追加します。

  1. 次のコードをアプリケーションに追加します。

    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  2. コードが正しいことを確認するため、次のコードと比較します。

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    Console.Write(@"c:\invoices");
    
    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  3. 次にコードを実行します。 出力コンソールに次の結果が表示されます。

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021            Complete!
    Invoice: 1022            Complete!
    
    Output Directory:
    c:\invoices
    
    日本の請求書を生成するには:
        c:\invoices\app.exe -j
    

要点

リテラル文字列の書式設定について、ここまで次のようなことを学習しました。

  • タブ \t、改行 \n、二重引用符 \" などの特殊文字をリテラル文字列に挿入する必要がある場合は、文字エスケープ シーケンスを使用します。
  • その他すべてのシナリオでバックスラッシュを使用する必要があるとき、バックスラッシュ \\ にエスケープ文字を使用します。
  • @ ディレクティブを使って、文字列に含まれる空白の書式設定とバックスラッシュ文字をすべて維持する逐語的文字列リテラルを作成します。
  • 文字列の中で Unicode 文字 (UTF-16) を表すには、\u と 4 文字コードを使用します。
  • Unicode 文字は、アプリケーションによっては正しく出力されないことがあります。