文字列にエスケープ文字を埋め込むには?[C#/VB/WPF]:.NET TIPS
エスケープ文字を使って、文字列中に改行文字などの特殊文字や変数の値などを埋め込む方法を、C#/Visual Basic/XAMLごとに説明する。
エスケープ文字とは、それに続く文字を、文字本来の意味とは別の意味に解釈することを示す文字である。C#におけるバックスラッシュ記号「\」などだ。また、ダブルクォーテーション記号「"」のように、その文字そのものが、文字本来の意味とは別の意味に解釈されるものもある。そういった文字を本来の意味のまま文字列に含めるにはどうしたらよいだろうか? 本稿では、C#とVisual Basic(以降、VB)、そしてWPFのXAMLの場合について解説する。
特定の方法をすぐに知りたいという方は以下のリンクを活用してほしい。
C#:通常の文字列
C#の通常の文字列リテラルでは、バックスラッシュ記号「\」がエスケープ文字だ。また、ダブルクォーテーション記号「"」や改行記号などの特殊文字は、そのままでは文字列リテラル内に記述できない。そういった文字を表記するには、バックスラッシュ記号「\」で始まるエスケープシーケンスを使う。
例えば、バックスラッシュ記号を文字列リテラルに埋め込むには「\\」というエスケープシーケンスを記述する。するとコンパイル時にエスケープシーケンス「\\」がバックスラッシュ記号「\」に変換される。また、同様にしてダブルクォーテーション記号は「\"」と書く。次の表にエスケープシーケンスの一覧を示す。
エスケープシーケンス | 意味 |
---|---|
\' | シングルクォーテーション「'」 |
\" | ダブルクォーテーション「"」 |
\\ | バックスラッシュ「\」 |
\0 | null文字 |
\a | ベル(警告音) |
\b | バックスペース |
\f | フォームフィード |
\n | 改行(ラインフィード) |
\r | キャリッジリターン |
\t | 水平タブ |
\u | 16進表記のUnicode文字 ※「\u」に続けて16進数4桁を記述する |
\U | 16進表記のUnicode文字 ※「\U」に続けて16進数8桁を記述する |
\x | 16進表記のASCII文字 ※「\x」に続けて16進数1〜4桁を記述する |
\v | 垂直タブ |
\u/\U/\xは、後続の16進数も含めてエスケープシーケンスである。
文字列リテラル内にダブルクオート「"」/改行/バックスラッシュ「\」を表記する例を、次のコードに示す。
Console.WriteLine("ダブルクオート「\"」、改行「\r\n」、バックスラッシュ「\\」");
// 16進表記を使っても同じ結果が得られる
Console.WriteLine("ダブルクオート「\x22」、改行「\u000D\u000A」、バックスラッシュ「\U0000005C」");
// 出力:
// ダブルクオート「"」、改行「
// 」、バックスラッシュ「\」
なお、上のコードはコンソールアプリなので改行記号として「\r\n」(キャリッジリターンとラインフィード)を使った。環境に応じた改行記号を使いたい場合は、Environmentクラス(System名前空間)のNewLineプロパティを利用する(これは文字列リテラル内に記述できない)。
VB:通常の文字列
VBの通常の文字列リテラルでは、ダブルクォーテーション記号「"」や改行記号などの特殊文字は、そのままでは文字列リテラル内に記述できない。
ダブルクォーテーション記号「"」を文字列リテラル内に記述するには、ダブルクォーテーション記号を2つ重ねて「""」と書く。それ以外の特殊文字は、Constantsクラス(Microsoft.VisualBasic名前空間)の定数か、Chr関数を使って表し、文字列と連結する。
Constantsクラスに定義されている文字列の定数を次の表に示す。
VBの文字列定数 | 意味 |
---|---|
vbCr | キャリッジリターン |
vbCrLf | キャリッジリターンとラインフィード |
vbFormFeed | フォームフィード |
vbLf | ラインフィード |
vbNewLine | 環境に応じた改行記号 |
vbNullChar | null文字(=Chr(0)) |
vbNullString | null文字を持つ文字列(他環境の関数呼び出し用) |
vbTab | 水平タブ |
vbVerticalTab | 垂直タブ |
VBで使える文字列定数 |
文字列リテラル内にダブルクオート「"」/改行/バックスラッシュ「\」を埋め込む例を、次のコードに示す。C#と違って、バックスラッシュ「\」はそのまま記述できる。
' 定数を使う
Console.WriteLine("ダブルクオート「""」、改行「" + vbCrLf + "」、バックスラッシュ「\」")
' Chr関数を使う
Console.WriteLine("ダブルクオート「" + Chr(34) + "」、改行「" + Chr(13) + Chr(10) + "」、バックスラッシュ「\」")
' 出力:
' ダブルクオート「"」、改行「
' 」、バックスラッシュ「\」
なお、上のコードはコンソールアプリなので改行記号としてvbCrLf(キャリッジリターンとラインフィード)を使った。環境に応じた改行記号を使いたい場合は、vbNewLineか、Environmentクラス(System名前空間)のNewLineプロパティを利用する。
C#/VB:逐語的文字列
逐語的文字列リテラル(原語は「verbatim string literals」なのだが、「逐語的リテラル文字列」と訳されることもある)では改行記号をそのまま記述できる。バックスラッシュ「\」で始まるエスケープシーケンスは利用できない。ダブルクォーテーション「"」は、ダブルクォーテーション「"」自身を記述するためのエスケープ文字となっている。
C#では、逐語的文字列は通常の文字列リテラルの前に@マークを付けて表現する。
VBでは、逐語的文字列とは呼んでいないが、VB 14(Visual Studio 2015)から文字列リテラル内に改行を含められるようになっている。C#とは違って、文字列リテラルの前に記号は付加しない。
文字列リテラル内にダブルクオート「"」/改行/バックスラッシュ「\」を埋め込む例を、次のコードに示す。C#でも、バックスラッシュ「\」をそのまま記述できる。
Console.WriteLine(@"ダブルクオート「""」、改行「
」、バックスラッシュ「\」");
// 出力:
// ダブルクオート「"」、改行「
// 」、バックスラッシュ「\」
Console.WriteLine("ダブルクオート「""」、改行「
」、バックスラッシュ「\」")
' 出力:
' ダブルクオート「"」、改行「
' 」、バックスラッシュ「\」
このVBのコードは、VB 14(Visual Studio 2015)以降のものである。
C#/VB:挿入文字列(補間文字列)
Interpolated Strings(「挿入文字列」や「補間文字列」などと訳されている)は、文字列リテラルの先頭にドルマーク「$」を付けた形で表される。C# 6.0/VB 14から利用できる。また、C#では逐語的文字列の記号「@」と併用できる(ただし「$@」の順に表記する)。
ここまでに述べてきたもの以外に、挿入文字列内では中かっこ("{"と"}")もエスケープ文字になる。挿入文字列内に中かっこそのものを記述するには、同じ中かっこを2つ連続して書く(「{{」/「}}」)。例を次のコードに示す。
int[] numbers = { 2, 3 };
Console.WriteLine($"numbers = {{ {numbers[0]}, {numbers[1]} }}");
// 出力:numbers = { 2, 3 }
Dim numbers() As Integer = {2, 3}
Console.WriteLine($"numbers = {{ {numbers(0)}, {numbers(1)} }}")
' 出力:numbers = { 2, 3 }
このコードは、C# 6.0/VB 14(Visual Studio 2015)以降のものである。
XAML:マークアップ拡張
WPFやUWPなどのXAMLでは、属性に記述する文字列を中かっこ「{」で始めると、それはマークアップ拡張になる。マークアップ拡張とは、リソースの参照やデータバインディングの指定などを行うものだ。属性文字列の先頭に中かっこ「{」そのものを記述したいときは、「{}{」としてエスケープする。
なお、WPFのStringFormat属性では、中かっこは値を受け取るプレースホルダーになるので、その属性文字列中に中かっこ「{」/「}」そのものを書くには、挿入文字列と同様に中かっこを2つ連続して書く(「{{」/「}}」)。
また、XAMLの属性文字列ではアンパサンド「&」で始まるエスケープシーケンスが使える(次の表)。
XAMLのエスケープシーケンス | 意味 |
---|---|
< | より小さい「<」 |
> | より大きい「>」 |
& | アンパサンド「&」 |
" | ダブルクォーテーション「"」 |
&#[10進数];/&#x[16進数]; | 10進表記/16進表記のUnicode文字 ※例:"はダブルクォーテーション「"」を表す |
XAMLのエスケープシーケンス |
以上の例を、次のコードに示す。これはWPFである。
<StackPanel x:Name="Panel1" VerticalAlignment="Center">
<TextBlock Text="{}{属性の先頭に"{"を書く。<>と&" />
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{{ x={0}, y={1} }}">
<Binding Path="X"/><!-- この値が上の「{0}」へ入る -->
<Binding Path="Y"/><!-- 同様に「{1}」へ入る -->
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
public MainWindow()
{
InitializeComponent();
Panel1.DataContext = new Point(2.0, 3.0); // X座標が2、Y座標が3
}
上のXAMLコードのStackPanelコントロールのデータコンテキストに、Pointオブジェクトを与えている。
上のコードの実行結果は次の画像のようになる。
まとめ
本稿では、C#/VB/WPFでエスケープ文字列を埋め込むための基本的なところを解説した。利用するクラスライブラリによっては、独自の特殊文字が定義されていて、本稿で述べた以外にもエスケープしなければならないこともある(System.Text.RegularExpressions名前空間のRegexクラスなど)。あるいは、手動でエスケープシーケンスに変換するのが大変なHTMLやXMLでは、そのための機能が提供されていることもある(System.Net名前空間のWebUtilityクラス/System.Security名前空間のSecurityElementクラスなど)。
カテゴリ:C# 処理対象:言語構文
カテゴリ:Visual Basic 処理対象:言語構文
カテゴリ:WPF 処理対象:言語構文
関連TIPS:文字列をXMLコード用にエスケープするには?[C#、VB]
関連TIPS:WindowsアプリケーションでHTMLデコード/エンコードを行うには?[4以降、C#、VB]
Copyright© Digital Advantage Corp. All Rights Reserved.